Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash unix:循环查找命令的结果_Bash_Shell_Loops_Unix_Find - Fatal编程技术网

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

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命令,可以按我的意愿输出(它查找名称中带有strelka的文件,并以.vcf结尾):

找到-名称*strelka*| grep'.vcf$'

但是我想迭代每一个,然后执行其他的东西

简单地说,我只是让它对每个文件进行行计数(但最终我想做更多,这只是我在玩),但它似乎已经不起作用了

我有:

对于
find中的i-名称\*strelka\*|grep'.vcf$'
;do wc-l$i;完成

有人知道这是怎么回事吗

  • 使用find-命名“*strelka*.vcf”,从而避免使用grep并允许您使用find-执行官

  • 将管道导入xargs,或使用-exec:

    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 '{}' +