I am doing a find
and then getting a list of files. How do I pipe it to another utility like cat
(so that cat displays the contents of all those files) and basically need to grep
something from these files.
Answer 1:
管道到另一个进程(虽然这不会完成你说你正在尝试做的):
command1 | command2
这将是command1输出发送作为命令2的输入
-exec
上find
(这会做你想要做什么-但具体到find
)find . -name '*.foo' -exec cat {} \;
(之间的一切
find
和-exec
是你已经使用find谓词。{}
将取代你发现到命令(特定文件cat {}
在这种情况下);在\;
是结束-exec
。命令)发送一个过程的输出作为命令行参数到另一个进程
command2 `command1`
例如:
cat `find . -name '*.foo' -print`
(注意,这些都是反引号不正规报价(我的键盘上的波浪线〜之下)。)这将输出发送
command1
至command2
作为命令行参数。 注意包含空格(换行等),该文件的名称将被分成不同的参数,虽然。
Answer 2:
现代版
POSIX 2008添加+
标记find
,这意味着它现在可以自动群体尽可能多的文件,合理成一个单一的命令执行,非常喜欢xargs
,不过它有许多优点:
- 你不必担心在文件名奇怪的字符。
- 你不必担心被命令以零文件名调用。
文件名的问题是一个问题xargs
无-0
选项,这个问题“甚至为零的文件名运行”是有或无的问题-0
选项-但GNU xargs
有-r
或--no-run-if-empty
选项,以防止这种情况发生。 此外,这个符号减少了工序的数量,而不是你可能会衡量性能上的差异。 因此,你可以理智写:
find . -exec grep something {} +
经典版
find . -print | xargs grep something
如果你在Linux或有GNU find
和xargs
命令,然后使用-print0
与find
和-0
与xargs
处理包含空格和其他奇数球字符的文件名。
find . -print0 | xargs -0 grep something
从调整结果grep
如果您不希望文件名(只是文本),再加入适当的选项, grep
(通常-h
以抑制“标题”)。 要绝对保证的文件名是由印刷grep
(即使只有一个文件被发现,或在最后一次调用grep
是只给1文件名),然后添加/dev/null
给xargs
命令行,所以总会出现至少有两个文件名。
Answer 3:
有几种方法可以路过返回的文件列表find
命令到cat
命令,虽然在技术上并非所有使用的管道,并没有真正管直接将cat
。
最简单的方法是使用反引号(
`
):cat `find [whatever]`
这需要的输出
find
和有效地放置它的命令行上cat
。 如果这不能很好地工作find
有太多的输出(超过可容纳在一个命令行),或者如果输出有特殊字符(如空格)。在一些炮弹,包括
bash
,可以使用$()
而不是反引号:cat $(find [whatever])
这是不太方便携带,但可嵌套。 除此之外,它拥有几乎相同的警告作为反引号。
因为发现什么是常见的运行,使用其他命令
find
,找有-exec
这对于每一个执行命令操作文件发现:find [whatever] -exec cat {} \;
的
{}
是用于文件名的占位符,并且\;
标志着该命令的结束(这是可能有其他后行动-exec
)。这将运行
cat
一次每一个文件,而不是运行的单个实例cat
传递多个文件名可以是效率低,可能没有你想对某些命令(虽然它的罚款行为cat
)。 语法也是一个尴尬的类型 - 你需要躲避分号,因为分号是特殊的外壳!有些版本的
find
(最明显的是GNU版本),让您更换;
与+
使用-exec
的附加模式运行的实例少cat
:find [whatever] -exec cat {} +
这将通过多个文件名到的每次调用
cat
,其可以是更有效的。请注意,这是不能保证使用单一的调用,但是。 如果命令行是太长,则参数跨多个调用蔓延
cat
。 对于cat
这可能不是什么大不了的事,但对于其他一些命令,这可能会改变以意想不到的方式行为。 在Linux系统上,命令行长度限制是相当大的,因此相对于其他一些操作系统分成多个调用是相当罕见的。经典的/便携的方法是使用
xargs
:find [whatever] | xargs cat
xargs
运行指定的命令(cat
,在这种情况下),并增加了基于它从标准输入读取参数。 就像-exec
用+
,如果需要的话,这将分手的命令行。 也就是说,如果find
产生过多的输出,它会运行cat
多次。 如同在一节中提到-exec
较早,也有有些命令的分裂可能会导致不同的行为。 需要注意的是使用xargs
这样有问题的文件名中使用空格,如xargs
只是使用空格作为分隔符。最强大的,便携,高效的方法也使用
xargs
:find [whatever] -print0 | xargs -0 cat
该
-print0
标志告诉find
使用\0
文件名之间(空字符)分隔符,和-0
标志告诉xargs
指望这些\0
分隔符。 这有几乎相同的行为在-exec
...+
的做法,虽然是更便携(但遗憾的是更详细)。
Answer 4:
要做到这一点(使用bash)我会做如下:
cat $(find . -name '*.foo')
这是被称为了“命令替换”,它在默认情况下这是非常方便易剥离换行!
更多相关信息点击这里
Answer 5:
听起来像一个shell脚本给我一份工作:
for file in 'find -name *.xml'
do
grep 'hello' file
done
或类似的东西
Answer 6:
这里是我的方式来查找包含一些内容,我很感兴趣的是很好地处理空间中的文件名也一样,只是一个单一的bash行的文件名:
find . -name \*.xml | while read i; do grep '<?xml' "$i" >/dev/null; [ $? == 0 ] && echo $i; done
Answer 7:
我用的是这样的:
find . -name <filename> -print0 | xargs -0 cat | grep <word2search4>
“ -print0
为“发现”和“”的说法-0
”为“xargs的”的说法,需要在文件路径/名称正确处理空白。
Answer 8:
find命令有,您可以使用这样的事情的说法-exec,你可以只是做grep的直接使用。
例如( 从这里开始,在此页面其他很好的例子 ):
find . -exec grep "www.athabasca" '{}' \; -print
Answer 9:
这里是我的镜头一般用途:
grep YOURSTRING `find .`
这将打印文件名
Answer 10:
在bash,以下是合适的:
find /dir -type f -print0 | xargs -0i cat {} | grep whatever
这将找到的所有文件/dir
目录,安全管文件名到xargs
,这将安全驾驶grep
。
跳绳xargs
是不是如果你有成千上万的文件中的一个好主意/dir
; cat
将打破由于过度参数列表的长度。 xargs
将整理所有为你。
该-print0
参数find
与网格-0
参数xargs
妥善处理与空格的文件名。 该-i
参数xargs
允许你插入在需要的文件名cat
命令行。 括号是通过管道输送到文件名代替cat
从命令find
。
Answer 11:
这对我的作品
find _CACHE_* | while read line; do
cat "$line" | grep "something"
done
Answer 12:
使用ggrep 。
ggrep -H -R -I "mysearchstring" *
搜索位于当前目录或子目录中包含文本的UNIX文件
Answer 13:
这将打印的名称和文件,只有递归内容..
find . -type f -printf '\n\n%p:\n' -exec cat {} \;
Answer 14:
你们是不是要在文件中查找文本? 你可以简单地使用grep为...
grep searchterm *
Answer 15:
要列出并查看所有abc.def文件内容的服务器上的目录/ GHI和/ JKL
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 ^# {} \;