unix:循环查找find命令的结果

时间:2014-03-12 21:14:44

标签: bash shell loops unix find

我有一个find命令,可以按照我的意愿输出(它在名称中查找带有strelka的文件,以.vcf结尾):

  
    找到。 -name * strelka * | grep' .vcf $'

  

但是我想迭代每个并执行其他的东西。

为了简单地试验,我只是让它对每个文件进行一次行计数(但最终我想要做更多的事情,这只是我玩的),但它已经没有了。似乎工作。

我有:

  
    

for find . -name \*strelka\* | grep '.vcf$';做wc -l $ i;完成了

  

有人知道这有什么问题吗?

3 个答案:

答案 0 :(得分:3)

  1. 使用find。 -name' * strelka * .vcf',从而避免使用grep并让你使用find ... -exec

  2. 管道进入xargs,或使用-exec:

    find . -name '*strelka*.vcf' | xargs wc -l  
    
    find . -name '*strelka*.vcf' -exec wc -l '{}' \;
    
  3. 出于各种原因,更喜欢后者。

    您的方法(在您的查找周围使用$(...))是正常的,除了:

    • 如果文件名中有空格,你会感到悲伤。 (你也会对xargs感到悲伤 - 那里有一个涉及\ 0的方式,但它有点神秘。)
    • 如果匹配文件太多,您将超出命令行长度限制。

答案 1 :(得分:2)

您可以按如下方式更改命令:

for i in $(find . -name \*strelka\* | grep '.vcf$'); do wc -l $i; done

find . -name \*strelka\* | grep '.vcf$' | while read i; do wc -l $i; done

find . -name \*strelka\* | grep '.vcf$' | xargs wc -l

您还可以改进查找命令以查找\*strelka\*.vcf以避免grep。

还要注意文件可能包含空格甚至换行符。他们可能会破坏你的命令。因此,最好的方法可能是使用:

find . -name '*strelka*.vcf' -exec wc -l '{}' \;

答案 2 :(得分:2)

假设您使用的是bash的最新版本(4.0或更高版本),则无需使用find;文件模式就足够了,还有globstar选项。

shopt -s globstar
for i in **/*strelka*.vcf; do
    wc -l $i
done

对于少量文件,您可以使用

wc -l **/*strelka*.vcf

对于大量文件,

find -name '*strelka*.vcf' -execdir wc -l '{}' +

效率最高。