2014-03-12 137 views
1

的結果我有輸出,因爲我想(它看起來與在名稱史翠卡文件,並與名爲.vcf結尾)find命令:UNIX:通過循環find命令

發現。 -name * strelka * | grep的「的.vcf $」

但我想,然後遍歷每執行額外的東西。爲了簡單地進行實驗,我只是讓它在每個文件上做一個行數(但最終我最終還是想做更多的事情,這只是我玩耍的時間),但它似乎並不像工作。

我:

因爲我在find . -name \*strelka\* | grep '.vcf$';做wc -l $ i;做

任何人都知道什麼是錯的呢?

+0

請不要改進問題中的命令,或者問題和答案都毫無意義。 – michas

回答

3
  1. 使用find。 -name '*史翠卡*的.vcf',從而避免了grep和讓你使用find ... -exec

  2. 無論是管道進入xargs的,或使用-exec:

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

身高後者出於各種原因。

你的方法(以$(...)在你的發現)是確定的,除了:

  • 您將有悲傷,如果有文件名中的空格。 (你也會對xargs感到悲傷 - 有一個涉及\ 0的方法,但它有點神祕。)
  • 如果匹配的文件太多,你將超出命令行長度限制。
+1

'xargs'版本會調用'wc'少許次數,可能只有一次(取決於有多少文件)。寫入的'-exec'版本將每個文件調用一次'wc'。在前一種情況下,您將從'wc'獲得可能有用的(或可能不希望的)總數。你可以修改'-exec'的情況,把'\;'改成'+'。 – rici

+0

第一個選項使用'find'和'xargs'我會建議使用:'find。 -print0 -name'* strelka * .vcf'| xargs -0 wc -l'。它的目的是確保你不會遇到包含'\ n'或其他preblematic字符的更奇怪文件名的問題。 – Lynch

1

您可以按如下改變你的命令:

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 '{}' \; 
1

假設您正在使用最近(4。0或更大)版本bash,您不需要使用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 '{}' + 

是最有效的。