如何管通过find命令返回的猫文件列表来查看所有文件如何管通过find命令返回的猫文件列表来查看所有

2019-05-12 14:37发布

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:

  1. 管道到另一个进程(虽然这不会完成你说你正在尝试做的):

     command1 | command2 

    这将是command1输出发送作为命令2的输入

  2. -execfind (这会做你想要做什么-但具体到find

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

    (之间的一切find-exec是你已经使用find谓词。 {}将取代你发现到命令(特定文件cat {}在这种情况下);在\;是结束-exec 。命令)

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

     command2 `command1` 

    例如:

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

    (注意,这些都是反引号不正规报价(我的键盘上的波浪线〜之下)。)这将输出发送command1command2作为命令行参数。 注意包含空格(换行等),该文件的名称将被分成不同的参数,虽然。



Answer 2:

现代版

POSIX 2008添加+标记find ,这意味着它现在可以自动群体尽可能多的文件,合理成一个单一的命令执行,非常喜欢xargs ,不过它有许多优点:

  1. 你不必担心在文件名奇怪的字符。
  2. 你不必担心被命令以零文件名调用。

文件名的问题是一个问题xargs-0选项,这个问题“甚至为零的文件名运行”是有或无的问题-0选项-但GNU xargs-r--no-run-if-empty选项,以防止这种情况发生。 此外,这个符号减少了工序的数量,而不是你可能会衡量性能上的差异。 因此,你可以理智写:

find . -exec grep something {} +

经典版

find . -print | xargs grep something

如果你在Linux或有GNU findxargs命令,然后使用-print0find-0xargs处理包含空格和其他奇数球字符的文件名。

find . -print0 | xargs -0 grep something

从调整结果grep

如果您不希望文件名(只是文本),再加入适当的选项, grep (通常-h以抑制“标题”)。 要绝对保证的文件名是由印刷grep (即使只有一个文件被发现,或在最后一次调用grep是只给1文件名),然后添加/dev/nullxargs命令行,所以总会出现至少有两个文件名。



Answer 3:

有几种方法可以路过返回的文件列表find命令到cat命令,虽然在技术上并非所有使用的管道,并没有真正管直接将cat

  1. 最简单的方法是使用反引号( ` ):

     cat `find [whatever]` 

    这需要的输出find和有效地放置它的命令行上cat 。 如果这不能很好地工作find有太多的输出(超过可容纳在一个命令行),或者如果输出有特殊字符(如空格)。

  2. 在一些炮弹,包括bash ,可以使用$()而不是反引号:

     cat $(find [whatever]) 

    这是不太方便携带,但可嵌套。 除此之外,它拥有几乎相同的警告作为反引号。

  3. 因为发现什么是常见的运行,使用其他命令find ,找有-exec这对于每一个执行命令操作文件发现:

     find [whatever] -exec cat {} \; 

    {}是用于文件名的占位符,并且\; 标志着该命令的结束(这是可能有其他后行动-exec )。

    这将运行cat一次每一个文件,而不是运行的单个实例cat传递多个文件名可以是效率低,可能没有你想对某些命令(虽然它的罚款行为cat )。 语法也是一个尴尬的类型 - 你需要躲避分号,因为分号是特殊的外壳!

  4. 有些版本的find (最明显的是GNU版本),让您更换;+使用-exec的附加模式运行的实例少cat

     find [whatever] -exec cat {} + 

    这将通过多个文件名到的每次调用cat ,其可以是更有效的。

    请注意,这是不能保证使用单一的调用,但是。 如果命令行是太长,则参数跨多个调用蔓延cat 。 对于cat这可能不是什么大不了的事,但对于其他一些命令,这可能会改变以意想不到的方式行为。 在Linux系统上,命令行长度限制是相当大的,因此相对于其他一些操作系统分成多个调用是相当罕见的。

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

     find [whatever] | xargs cat 

    xargs运行指定的命令( cat ,在这种情况下),并增加了基于它从标准输入读取参数。 就像-exec+ ,如果需要的话,这将分手的命令行。 也就是说,如果find产生过多的输出,它会运行cat多次。 如同在一节中提到-exec较早,也有有些命令的分裂可能会导致不同的行为。 需要注意的是使用xargs这样有问题的文件名中使用空格,如xargs只是使用空格作为分隔符。

  6. 最强大的,便携,高效的方法也使用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 ^# {} \;


文章来源: How to pipe list of files returned by find command to cat to view all the files
标签: unix find pipe