如何从 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,可能需要转义它,如 '{}'
.
有几种方法可以做到这一点。
- 如果有非
.txt
文件可能有用地包含关键字:
grep -r KEYWORD *
这使用 grep
的递归目录搜索选项。
- 仅搜索
.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 runs
grep` 之前积累了许多匹配的文件。
我正在 运行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,可能需要转义它,如 '{}'
.
有几种方法可以做到这一点。
- 如果有非
.txt
文件可能有用地包含关键字:
grep -r KEYWORD *
这使用 grep
的递归目录搜索选项。
- 仅搜索
.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 runs
grep` 之前积累了许多匹配的文件。