如何将由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 cat
xargs
运行指定的命令(本例中为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为从find
inputcat
命令的文件名。
我使用这样的东西:
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 ^# {} \;