当我想在整个树中搜索某些内容时,我使用
find . -type f -print0 | xargs -0 grep <search_string>
就性能或简洁性而言,是否有更好的方法来做到这一点?
答案1
检查您是否grep
支持-r
选项(例如递归):
grep -r <search_string> .
答案2
如果您想递归到子目录:
grep -R 'pattern' .
该-R
选项不是标准选项,但大多数常见grep
实现都支持。
答案3
次优答案:您可以运行而不是通过管道输入find
into的输出grep
find . -type f -exec grep 'research' {} '+'
瞧,一个命令而不是两个!
解释 :
find . -type f
查找 中的所有常规文件。
-exec grep 'research'
grep '研究'
{}
在找到的文件名中
'+'
对所有文件名使用一个命令,而不是对每个文件名使用一次。
Nb :';'
每个文件名都会出现一次。
除此之外,如果您使用它来处理源代码,您可以查看ack
,它是为了轻松查找代码位而设计的。
编辑 :
你可以稍微扩展一下这项研究。首先,您可以使用-name ''
的 开关find
来查找具有指定命名模式的文件。
例如 :
仅对应于日志的文件:
-name '*.log'
仅对应于 c 标头的文件,但文件扩展名不能坚持使用大写或小写:
-iname *.c
Nb :与grep
and一样ack
,-i
开关在这种情况下表示不区分大小写。
在这种情况下,grep 将显示不带颜色和行号的内容。
您可以使用--color
和-n
开关(分别是文件中的颜色和行号)来更改它。
最后,你可以得到类似的东西:
find . -name '*.log' -type f -exec grep --color -n 'pattern' {} '+'
例如
$ find . -name '*.c' -type f -exec grep -n 'hello' {} '+'
./test2/target.c:1:hello
答案4
如果您正在处理大量文件,则如果您修剪需要搜索的文件而不是 grep 子文件夹中的所有文件,则 grep 运行速度会更快。
我有时使用这种格式:
grep "primary" `find . | grep cpp$`
.
查找以 .txt 结尾的子文件夹中的所有文件cpp
。然后 grep 这些文件查找“primary”。
如果需要,您可以继续将这些结果传递到进一步的 grep 调用中:
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"