如何从 Linux ls 或 find 命令的文件列表中获取内容

How to grep contents from list of files from Linux ls or find command

我正在 运行ning -> "find . -name '*.txt'" 命令并获取文件列表。

我得到下面提到的输出:

./bsd/contrib/amd/ldap-id.txt
./bsd/contrib/expat/tests/benchmark/README.txt
./bsd/contrib/expat/tests/README.txt
./bsd/lib/libc/softfloat/README.txt

等等,

在这些文件中,我如何 运行 grep 命令并读取内容并仅过滤那些具有特定关键字的文件?例如"version" 在里面。

find 中通常内置了一个函数,但为了跨平台移植,我通常使用 xargs。假设你想直接找到当前文件中或下面的所有 xml 文件,并得到每个出现的 'foo' 的列表,你可以这样做:

find ./ -type f -name '*.xml' -print0 | xargs -0 -n 1 grep -H foo

它应该是不言自明的,除了 -print0-0,它用 NUL 分隔文件名而不是换行符,-0 告诉 xargs 使用这些 NUL 而不是解释空格和引号作为语法(如果文件名包含其中任何一个,它可能会混淆)。

xargs 是实现此目的的好方法,并且已经介绍过了。

find-exec选项对此也很有用。它将对从查找返回的所有文件执行命令。

要尽可能少地调用 grep,将多个文件名传递给每个调用:

find . -name '*.txt' -exec grep -H 'foo' {} +

或者,为找到的每个文件恰好调用一次grep

find . -name '*.txt' -exec grep -H 'foo' {} ';'

在任何一种情况下,{} 都像是 find 中值的占位符;如果你的 shell 是 zsh,可能需要转义它,如 '{}'.

有几种方法可以做到这一点。

  1. 如果有非.txt 文件可能有用地包含关键字:
grep -r KEYWORD *

这使用 grep 的递归目录搜索选项。

  1. 仅搜索 .txt 个文件:
find . -name '*.txt' -exec grep KEYWORD {} \;

or

find . -name '*.txt' -exec grep KEYWORD {} +

or

find . -execdir grep KEYWORD {}

第一次为每个匹配的文件运行 grep。第二次运行 grep 次要少得多,在每个目录中调用一次 grep. The third form runsgrep` 之前积累了许多匹配的文件。