我正在查找文件列表。

我如何将它输送到另一个实用程序,如cat,以便cat显示所有这些文件的内容?

然后,我将使用grep来搜索这些文件中的一些文本。


当前回答

您正在尝试在文件中查找文本吗?你可以简单地使用grep…

grep searchterm *

其他回答

find命令有一个-exec参数,你可以用它来做类似的事情,你可以直接用它来做grep。

例如(从这里,其他好的例子在本页):

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

使用ggrep。

ggrep -H -R -I "mysearchstring" *

在Unix中搜索包含位于当前目录或子目录中的文本的文件

现代版

POSIX 2008添加了+标记来查找,这意味着它现在自动将尽可能多的文件分组到单个命令执行中,非常像xargs,但有一些优点:

您不必担心文件名中的奇数字符。 您不必担心使用零文件名调用命令。

文件名问题是在没有-0选项的xargs中出现的,“即使没有文件名也运行”问题是在没有-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只给出了一个文件名),然后在xargs命令行中添加/dev/null,这样至少会有两个文件名。

这对我很有用

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

下面是我找到包含一些我感兴趣的内容的文件名的方法,只是一个简单的bash行,很好地处理文件名中的空格:

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