我正在投放 - > “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命令并读取内容并仅过滤那些具有特定关键字的文件?例如其中的“版本”。
答案 0 :(得分:4)
xargs
是实现这一目标的好方法,已经涵盖了它。
-exec
的{{1}}选项对此也很有用。它将对从find返回的所有文件执行命令。
尽可能少地调用find
,为每次调用传递多个文件名:
grep
或者,为每个找到的文件调用find . -name '*.txt' -exec grep -H 'foo' {} +
一次:
grep
在任何一种情况下,find . -name '*.txt' -exec grep -H 'foo' {} ';'
就像是来自{}
的值的占位符;如果您的shell是zsh,则可能需要将其转义,如find
。
答案 1 :(得分:0)
通常有一个内置于find的功能,但是为了跨平台移植,我通常使用xargs。假设您要直接在当前或下面找到所有xml文件,并获取每次出现的' foo'的列表,您可以这样做:
find ./ -type f -name '*.xml' -print0 | xargs -0 -n 1 grep -H foo
它应该是不言自明的,除了-print0
,它用NUL而不是换行符分隔文件名,以及-0
,它告诉xargs使用那些NUL而不是将空格和引号解释为语法(如果文件名包含,可能会混淆它。)
答案 2 :(得分:0)
有几种方法可以实现这一目标。
.txt
个文件可能会有用地包含关键字:grep -r KEYWORD *
这使用grep
的递归目录搜索选项。
.txt
个文件:find . -name '*.txt' -exec grep KEYWORD {} \;
或
find . -name '*.txt' -exec grep KEYWORD {} +
或
find . -execdir grep KEYWORD {}
第一个为每个匹配的文件运行grep
。第二个运行grep
的次数少得多,在每个目录中调用grep. The third form runs
grep`之前累积了许多匹配的文件。