Bash unix:循环查找命令的结果
我有一个find命令,可以按我的意愿输出(它查找名称中带有strelka的文件,并以.vcf结尾): 找到-名称*strelka*| grep'.vcf$' 但是我想迭代每一个,然后执行其他的东西 简单地说,我只是让它对每个文件进行行计数(但最终我想做更多,这只是我在玩),但它似乎已经不起作用了 我有: 对于Bash unix:循环查找命令的结果,bash,shell,loops,unix,find,Bash,Shell,Loops,Unix,Find,我有一个find命令,可以按我的意愿输出(它查找名称中带有strelka的文件,并以.vcf结尾): 找到-名称*strelka*| grep'.vcf$' 但是我想迭代每一个,然后执行其他的东西 简单地说,我只是让它对每个文件进行行计数(但最终我想做更多,这只是我在玩),但它似乎已经不起作用了 我有: 对于find中的i-名称\*strelka\*|grep'.vcf$';do wc-l$i;完成 有人知道这是怎么回事吗 使用find-命名“*strelka*.vcf”,从而避免使用grep并
find中的i-名称\*strelka\*|grep'.vcf$'
;do wc-l$i;完成
有人知道这是怎么回事吗
find . -name '*strelka*.vcf' | xargs wc -l
find . -name '*strelka*.vcf' -exec wc -l '{}' \;
- 如果文件名中有空格,你会很伤心。(使用xargs时也会感到悲伤-有一种方法涉及\0,但它有点神秘。)
- 如果匹配的文件太多,则会超过命令行长度限制
for i in $(find . -name \*strelka\* | grep '.vcf$'); do wc -l $i; done
或
或
您还可以改进find命令来查找\*strelka\*.vcf
,以避免grep
还要注意,文件可能包含空格甚至换行符。他们可能会破坏你的命令。因此,最好的方法可能是使用:
find . -name '*strelka*.vcf' -exec wc -l '{}' \;
假设您正在使用最新(4.0或更高版本)的
bash
,则不需要为此使用find
;文件模式以及globstar
选项就足够了
shopt-s globstar
对于**/*strelka*.vcf中的i;做
wc-l$i
完成
对于少量文件,您可能只需要使用
wc -l **/*strelka*.vcf
对于大量文件
find -name '*strelka*.vcf' -execdir wc -l '{}' +
是最有效的。xargs版本将调用
wc
的次数减少很多,可能只调用一次(取决于文件的数量)。编写的-exec
版本将为每个文件调用一次wc
。在前一种情况下,您可能会从wc
获得有用(或不需要的)总计。您可以通过更改\,修改-exec
案例以执行相同的操作
到+
。对于使用find
和xargs
的第一个选项,我建议使用:find-print0-name'*strelka*.vcf'| xargs-0 wc-l
。这是为了确保您不会在包含\n
或其他问题字符的wierd filename中遇到问题。请不要改进问题中的命令,否则问题和答案都会变得毫无意义。如果文件名包含空格或其他特殊字符,一些解决方案会失败。要解决该问题,请参阅
wc -l **/*strelka*.vcf
find -name '*strelka*.vcf' -execdir wc -l '{}' +