当我想在整棵树中搜索某些内容时,我使用
find . -type f -print0 | xargs -0 grep <search_string>
在性能或简洁性方面,有更好的方法吗?
当我想在整棵树中搜索某些内容时,我使用
find . -type f -print0 | xargs -0 grep <search_string>
在性能或简洁性方面,有更好的方法吗?
Answers:
检查您的grep
支持-r
选项(对于recurse):
grep -r <search_string> .
--exclude-dir
性能的评论,我们有一个赢家!
grep
在最近的FreeBSD和Linux发行版中都支持它。又为什么--exclude-dir
呢?您不是要搜寻整棵树吗?
--exclude-dir
实际上在我的用例中很方便(因为子树的部分很大,但是没用),我确实询问过性能...但是您说得对,这不是必需的。
--exclude-dir
是GNU专有的grep
。(-:
一个子最佳答案:不是管道的输出find
入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
和和一样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
-name '*.log'
它更快的过滤器。
如果要递归到子目录:
grep -R 'pattern' .
该-R
选项不是标准选项,但是大多数常见的grep
实现都支持该选项。
-r
,而不是-R
跳过时,GNU的grep而言符号链接
grep
我认为,尽管当前的GNU 实现捕获了递归。否则,这取决于您所说的“树”的含义。
grep
事情。如果用户的目录结构中存在符号链接循环,那么这就是用户的问题:-)
/sys/devices/cpu/subsystem/devices/cpu/subsystem/devices/cpu/...
(像XI这样的工具会照顾我(除非它们提供被称为“ AI”的怪异魔术)。)(-;
如上所述-r
或-R
(取决于所需的符号链接处理)是一个快速的选择。
但是-d <action>
有时可能会有用。
一件好事-d
是skip命令,当您只想扫描当前级别时,它将使“ grep:directory_name:是目录”静音。
$ grep foo *
grep: q2: Is a directory
grep: rt: Is a directory
$ grep -d skip foo *
$
而且当然:
$ grep -d recurse foo *
(list of results that don't exist because the word foo isn't in our source code
and I wouldn't publish it anyway).
$
该-d skip
选项在另一个脚本中非常方便,因此您不必这样做2> /dev/null
。:)
如果要处理大量文件,则如果您修剪需要搜索的文件而不是grep子文件夹中的所有文件,则grep的运行速度会更快。
我有时会使用这种格式:
grep "primary" `find . | grep cpp$`
在.
结尾的子文件夹中找到所有文件cpp
。然后grep这些文件为“主要”。
如果需要,可以继续将这些结果传递给进一步的grep调用:
grep "primary" `find . | grep cpp$` | grep -v "ignoreThis" | grep -i "caseInsensitiveGrep"