【问题标题】:Shell how to use a command on every file in a directoryShell如何对目录中的每个文件使用命令
【发布时间】:2016-08-05 08:35:18
【问题描述】:

所以我要做的是找到目录内和目录下的所有常规文件。对于这些常规文件中的每一个,我必须对模式($ARG)进行 egrep 并找出文件的输出是否与模式($ARG)匹配,如果匹配,它将向计数器添加一个。

我目前拥有的是文件命令:

 $count = 0
 file *

但是,我无法获取 egrep &ARG > /dev/null/ ;回声$?遍历从 (file *) 出现的每个文件。

我了解该文件 * | egrep 目录 > /dev/null ;回声$?将输出 0,因为它在文件中找到模式“目录”,但无法让它循环遍历每个常规文件,因此我可以在每次匹配模式时向计数器添加一个。

【问题讨论】:

    标签: bash shell unix


    【解决方案1】:

    问题不清楚,但如果您要查找包含模式的文件数

    grep -l "pattern" * 2>/dev/null | wc -l
    

    会给你的。来自目录的错误将被忽略。

    如果你想递归地做完整的树,包括点文件

    grep -r -l "pattern" | wc -l
    

    【讨论】:

    • 你需要-r 递归到子目录。
    • @Aleksej:请问您为什么删除了我的答案?你声称它没有提供问题的答案。我认为确实如此: OP 要求一个程序来解决一个特定的问题,我发布了一个。如果您认为我的程序不满足 OP 的要求(当然,这是可能的——我从未声称在编程中没有出错),如果您指出这个错误会更好。跨度>
    【解决方案2】:

    你可以试试这个:

    counter=0
    find /path/to/directory/ -type f | \
        while read file
        do
            if grep -i -e -q "$pattern" "$file"
            then counter=$((counter+1))
            fi
        done
    echo "$counter"
    

    【讨论】:

    • $counter 仍将为零,因为 while 循环在管道中
    • 另外,你有 -q 作为 -e 的参数
    • -q 表示如果找到匹配项则以 0 退出,如果找到任何匹配项,则计数器将递增。我跳过了 if else 条件的方括号以使代码更清晰。
    • 我知道这一点,我为你使用它而鼓掌。但是你需要-q -e "$pattern"-e "$pattern" -q——不要把-q 放在-e 和它的参数之间。
    • 但是您的答案(以及接受的答案)根本上是错误的:请参阅我的第一条评论和mywiki.wooledge.org/BashFAQ/024
    【解决方案3】:

    http://mywiki.wooledge.org/BashFAQ/020

    counter=0
    shopt -s globstar nullglob
    for file in **; do
        grep -qiE "$pattern" "$file" && ((counter++))
    done
    echo "$counter"
    

    如果要包含隐藏文件,请添加shopt -s dotglob

    【讨论】:

      猜你喜欢
      • 2020-12-16
      • 2010-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-29
      • 1970-01-01
      • 2013-10-28
      相关资源
      最近更新 更多