我有一个find命令,可以按照我的意愿输出(它在名称中查找带有strelka的文件,以.vcf结尾):
找到。 -name * strelka * | grep' .vcf $'
但是我想迭代每个并执行其他的东西。
为了简单地试验,我只是让它对每个文件进行一次行计数(但最终我想要做更多的事情,这只是我玩的),但它已经没有了。似乎工作。
我有:
for
find . -name \*strelka\* | grep '.vcf$'
;做wc -l $ i;完成了
有人知道这有什么问题吗?
答案 0 :(得分:3)
使用find。 -name' * strelka * .vcf',从而避免使用grep并让你使用find ... -exec
管道进入xargs,或使用-exec:
find . -name '*strelka*.vcf' | xargs wc -l
find . -name '*strelka*.vcf' -exec wc -l '{}' \;
出于各种原因,更喜欢后者。
您的方法(在您的查找周围使用$(...))是正常的,除了:
答案 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 '{}' +
效率最高。