【问题标题】:How to remove files starting with #! or ending with .sh in the name如何删除以#开头的文件!或以 .sh 结尾
【发布时间】:2023-07-28 16:57:01
【问题描述】:

我是 shell 编程的新手。我想将任何可执行文件、任何以 shebang(#!) 开头的文件以及任何名称以 .sh 结尾的文件从目录移动到 /tmp/backup 并记录移动文件的名称。

这就是我到目前为止所做的事情

使用#^搜索文件

grep -ircl --exclude=*.{png,jpg,gif,html,jar} "^#" /home

查找可执行文件

find . -type f -perm +111 or find . -type f -perm -u+x

现在我正在努力如何将这两个命令组合起来以获得最终输出,我可以通过它来执行备份并从当前目录中删除

谢谢

【问题讨论】:

  • 最好的学习方法是先尝试,然后在遇到困难时寻求指导。如果您已经尝试过,请发布您迄今为止所做的事情,以便其他人可以为您提供具体和相关的建议。
  • 这是我到目前为止所做的 使用#^ grep -ircl --exclude=*.{png,jpg,gif,html,jar} "^#" /home 查找可执行文件寻找 。 -type f -perm +111 或查找 . -type f -perm -u+x 现在我正在努力如何组合这两个命令以获得最终输出,我可以通过它来执行备份并从当前目录中删除
  • 将其编辑到您的问题中。 cmets中的代码很难阅读。

标签: shell unix


【解决方案1】:

使用 xargs 命令

"查找命令" | xargs "grep 命令"

【讨论】:

    【解决方案2】:

    您可以将所有内容放在一个文件中,对其进行排序,然后使用 Awk 对其进行处理:

    # Select all files to move
    grep -ircl --exclude=*.{png,jpg,gif,html,jar} '^#\!' /home > list.txt
    find /home -type f \( -perm -u+x -o -name "*.sh" \) -print >> list.txt
    
    # Feed them to Awk that will log and move the file
    sort list.txt | uniq | awk -v LOGFILE="mylog.txt" '
    
    { print "Moving " $0 >> LOGFILE
      "mv -v --backup \"" $0 "\" /tmp/backup" | getline
      print >> LOGFILE }'
    

    编辑:您可以通过添加一些变量和一些额外的检查,从这个框架中制作一个正式的脚本:

    #!/bin/bash
    
    LIST="$( mktemp || exit 1 )"
    LOG="/tmp/mylog.txt"
    SOURCE="/home"
    TARGET="/tmp/backup"
    
    mkdir -p "${TARGET}"
    
    cd "${SOURCE}" || exit 1
    
    # Select all files to move
    grep -ircl --exclude=*.{png,jpg,gif,html,jar} '^#\!' "${SOURCE}" > "${LIST}"
    find "${SOURCE}" -type f \( -perm -u+x -o -name "*.sh" \) -print >> "${LIST}"
    
    # Feed them to Awk that will log and move the file
    sort "${LIST}" | uniq | awk -v LOGFILE="${LOG}" -v TARGET="${TARGET}" '
    
    { print "Moving " $0 >> LOGFILE
      "mv -v --backup \"" $0 "\" " TARGET | getline
      print >> LOGFILE }'
    

    【讨论】:

    • 嗨,它给了我以下错误。 sh:-c:第 0 行:寻找匹配的“”时出现意外 EOF sh:-c:第 1 行:语法错误:文件意外结束
    • 能否请您简要介绍一下脚本的工作原理?
    • 命令应该可以正常工作。也许您在某处忘记了双引号或反斜杠(它可能在 awk 命令的引用中)。我在给出的命令中添加了一个更正式的脚本示例。 HTH。
    • 我测试了命令和完整的脚本,它们对我来说都能正常工作。
    最近更新 更多