如何将由find命令返回的文件列表传递给cat来查看所有文件
我正在做一个find ,然后得到一个文件列表。 我如何pipe它到另一个工具像cat (所以猫显示所有这些文件的内容),基本上需要从这些文件grep东西。 
- 
pipe道到另一个进程(虽然这不会完成你所说的你正在做的事情): command1 | command2这将发送command1的输出作为command2的input 
- 
-exec在一个find(这将做你想做的 – 但是具体find)find . -name '*.foo' -exec cat {} \;( find和-exec之间的所有内容都是您已经使用的查找谓词。{}会将您find的特定文件replace为命令(在这种情况下为cat {});\;将结束-exec命令。
- 
将一个进程的输出作为命令行参数发送到另一个进程 command2 `command1`例如: cat `find . -name '*.foo' -print`(请注意,这些是BACK-QUOTES不是普通的引号(在我的键盘上的波浪号下面)。)这将把 command1的输出作为命令行参数发送到command2。 请注意,包含空格(换行符等)的文件名将被分解为单独的参数。
 find . -print | xargs grep something 
 如果你在Linux上或者有GNU find和xargs ,那么使用-print0和find以及-0和xargs来处理包含空格和其他奇数球字符的文件名。 
 如果你不想要文件名 – 只是文本 – 然后添加一个适当的选项,以grep (通常-h压制'标题')。 要绝对保证文件名是由grep打印的(即使只find一个文件,或者最后一次调用grep只给出一个文件名),然后在/dev/null xargs命令行中添加/dev/null ,这样总会有至less有两个文件名。 
 请注意,POSIX 2008添加了+标记来find这意味着它现在自动将尽可能多的文件合并到单个命令执行中,非常类似于xargs ,但具有许多优点: 
- 您不必担心文件名中的奇怪字符。
- 您不必担心使用零个文件名称调用该命令。
 这两个都是没有-0选项的xargs问题。 因此,你可以明智地写: 
 find . -exec grep something {} + 
 有几种方法可以将find命令返回的文件列表传递给cat命令,虽然技术上并不全是使用pipe道,实际上没有一个pipe道直接传给cat 。 
- 
最简单的是使用反引号: cat `find [whatever]`等效地,可以使用 $()而不是在某些shell中反引号,包括bash:cat $(find [whatever])这是便携式,但可嵌套。 两种语法都将 find的输出放在cat的命令行上。 如果find输出太多(比命令行更适合)或者输出具有特殊字符(如空格),则这种方法效果不佳。
- 
你可以使用 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系统上,命令行长度限制非常大,因此与其他操作系统相比,分裂为多个调用是非常罕见的。
- 
经典/便携式的方法是使用 xargs:find [whatever] | xargs catxargs运行指定的命令(本例中为cat),并根据从stdin读取的内容添加参数。 就像-exec+,这将打破命令行,如果有必要的话。 也就是说,如果find输出太多,就会多次运行cat。 正如前面关于-exec的部分所提到的那样,有一些命令可能导致不同的行为。 请注意,像这样使用xargs导致文件名空间问题,因为xargs只是使用空格作为分隔符。
- 
最健壮,便携和高效的方法也使用 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 ^# {} \;