如何将由find命令返回的文件列表传递给cat来查看所有文件

我正在做一个find ,然后得到一个文件列表。 我如何pipe它到另一个工具像cat (所以猫显示所有这些文件的内容),基本上需要从这些文件grep东西。

  1. pipe道到另一个进程(虽然这不会完成你所说的你正在做的事情):

     command1 | command2 

    这将发送command1的输出作为command2的input

  2. -exec在一个find (这将做你想做的 – 但是具体find

     find . -name '*.foo' -exec cat {} \; 

    find-exec之间的所有内容都是您已经使用的查找谓词。 {}会将您find的特定文件replace为命令(在这种情况下为cat {} ); \;将结束-exec命令。

  3. 将一个进程的输出作为命令行参数发送到另一个进程

     command2 `command1` 

    例如:

     cat `find . -name '*.foo' -print` 

    (请注意,这些是BACK-QUOTES不是普通的引号(在我的键盘上的波浪号下面)。)这将把command1的输出作为命令行参数发送到command2 。 请注意,包含空格(换行符等)的文件名将被分解为单独的参数。

 find . -print | xargs grep something 

如果你在Linux上或者有GNU findxargs ,那么使用-print0find以及-0xargs来处理包含空格和其他奇数球字符的文件名。

如果你不想要文件名 – 只是文本 – 然后添加一个适当的选项,以grep (通常-h压制'标题')。 要绝对保证文件名是由grep打印的(即使只find一个文件,或者最后一次调用grep只给出一个文件名),然后在/dev/null xargs命令行中添加/dev/null ,这样总会有至less有两个文件名。


请注意,POSIX 2008添加了+标记来find这意味着它现在自动将尽可能多的文件合并到单个命令执行中,非常类似于xargs ,但具有许多优点:

  1. 您不必担心文件名中的奇怪字符。
  2. 您不必担心使用零个文件名称调用该命令。

这两个都是没有-0选项的xargs问题。 因此,你可以明智地写:

 find . -exec grep something {} + 

有几种方法可以将find命令返回的文件列表传递给cat命令,虽然技术上并不全是使用pipe道,实际上没有一个pipe道直接传给cat

  1. 最简单的是使用反引号:

     cat `find [whatever]` 

    等效地,可以使用$()而不是在某些shell中反引号,包括bash

     cat $(find [whatever]) 

    这是便携式,但可嵌套。

    两种语法都将find的输出放在cat的命令行上。 如果find输出太多(比命令行更适合)或者输出具有特殊字符(如空格),则这种方法效果不佳。

  2. 你可以使用find-exec动作,它为每个find的文件执行一个命令:

     find [whatever] -exec cat {} \; 

    这将为每个单独的文件运行一次cat ,而不是运行一个cat的单个实例,传递多个文件名,这可能是低效率的,可能没有你想要的某些命令的行为(虽然对于cat来说是好的)。 语法也是一个尴尬的types – 你需要转义分号,因为分号是特殊的壳!

    一些版本的find (最值得注意的是GNU版本)让你replace;+来使用find的追加模式来运行较less的cat实例。

     find [whatever] -exec cat {} + 

    这将传递多个文件名到每个cat调用,这可以更有效率。 请注意, 保证使用单个调用,但是。 如果命令行太长,那么这个参数就会分散在cat多个调用中。 对于cat这可能不是什么大不了的事情,但是对于其他一些命令,这可能会以不希望的方式改变行为。 在Linux系统上,命令行长度限制非常大,因此与其他操作系统相比,分裂为多个调用是非常罕见的。

  3. 经典/便携式的方法是使用xargs

     find [whatever] | xargs cat 

    xargs运行指定的命令(本例中为cat ),并根据从stdin读取的内容添加参数。 就像-exec + ,这将打破命令行,如果有必要的话。 也就是说,如果find输出太多,就会多次运行cat 。 正如前面关于-exec的部分所提到的那样,有一些命令可能导致不同的行为。 请注意,像这样使用xargs导致文件名空间问题,因为xargs只是使用空格作为分隔符。

  4. 最健壮,便携和高效的方法也使用xargs

     find [whatever] -print0 | xargs -0 cat 

    -print0标志告诉find在文件名之间使用\0 (空字符)分隔符, -0标志告诉xargs期望这些\0分隔符。 这与-exec+方法具有几乎相同的行为,但是更便于使用(但不幸的是更详细)。

要实现这个(使用bash),我会做如下:

 cat $(find . -name '*.foo') 

这就是所谓的“命令replace”,它会在默认情况下取消换行,这非常方便!

更多信息在这里

听起来像一个shell脚本给我的工作:

 for file in 'find -name *.xml' do grep 'hello' file done 

或类似的东西

这里是我find包含我感兴趣的内容的文件名的方法,只是一个很好地处理文件名空间的单行bash行:

 find . -name \*.xml | while read i; do grep '<?xml' "$i" >/dev/null; [ $? == 0 ] && echo $i; done 

find命令有一个-exec参数,可以用于这样的事情,你可以直接使用grep来完成。

例如( 从这里,在这个页面上的其他很好的例子 ):

 find . -exec grep "www.athabasca" '{}' \; -print 

这是我一般使用的镜头:

 grep YOURSTRING `find .` 

它将打印文件名称

在bash中,以下是适当的:

 find /dir -type f -print0 | xargs -0i cat {} | grep whatever 

这将find/dir目录中的所有文件,并安全地将文件名转换为xargs ,这将安全地驱动grep

如果在/dir有数千个文件,则跳过xargs并不是一个好主意; cat会由于过多的参数列表长度而中断。 xargs会为你sorting。

-print0参数用xargs-0参数find网格,以正确处理具有空格的文件名。 xargs-i参数允许您在cat命令行所需的位置插入文件名。 方括号被replace为从findinputcat命令的文件名。

我使用这样的东西:

 find . -name <filename> -print0 | xargs -0 cat | grep <word2search4> 

正确处理文件path/名称中的空格需要“find”和“ -0 ”参数的“ -print0 ”参数以用于“xargs”。

这对我有用

 find _CACHE_* | while read line; do cat "$line" | grep "something" done 

使用ggrep 。

 ggrep -H -R -I "mysearchstring" * 

在unix中search包含位于当前目录或子目录中的文本的文件

你想在文件中find文本? 你可以简单地使用grep …

 grep searchterm * 

列出并查看目录/ ghi和/ jkl中服务器上所有abc.def文件的内容

 find /ghi /jkl -type f -name abc.def 2> /dev/null -exec ls {} \; -exec cat {} \; 

要列出具有注释条目的abc.def文件,并显示目录/ ghi和/ jkl中的条目

 find /ghi /jkl -type f -name abc.def 2> /dev/null -exec grep -H ^# {} \;