我正在尝试找到一种方法来扫描整个 Linux 系统,查找包含特定文本字符串的所有文件。只是为了澄清,我在文件中寻找文本,而不是文件名。
当我查找如何做到这一点时,我遇到了两次这个解决方案:
find / -type f -exec grep -H 'text-to-find-here' {} \;
但是,它不起作用。它似乎显示系统中的每个文件。
这是否接近正确的方法呢?如果没有,我该怎么办?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目非常有用。
请执行下列操作:
grep -rnw '/path/to/somewhere/' -e 'pattern'
-r
或-R
是递归的, -n
是行号,和-w
代表整个单词的匹配。 -l
(小写 L)以仅提供匹配文件的文件名。 除此之外, - --exclude
, - --include
, - --exclude-dir
标志可用于高效搜索:
这只会搜索那些具有. c 或. h 扩展名的文件:
grep --include=\*.{c,h} -rnw '/path/to/somewhere/' -e "pattern"
这将排除搜索所有以. o 扩展名结尾的文件:
grep --exclude=*.o -rnw '/path/to/somewhere/' -e "pattern"
对于目录,可以通过--exclude-dir
参数排除特定目录。例如,这将排除目录 dir1 /,dir2 / 以及所有匹配 * .dst /:
grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
这对我来说非常有效,可以达到和你一样的目的。
有关更多选项,请查看man grep
。
你可以使用grep -ilR
:
grep -Ril "text-to-find-here" /
i
代表忽略大小写(在你的情况下是可选的)。 R
代表递归。 l
代表 “显示文件名,而不是结果本身”。 /
表示从机器的根目录开始。 你可以使用ack 。它就像grep的源代码。您可以使用它扫描整个文件系统。
做就是了:
ack 'text-to-find-here'
在根目录中。
您还可以使用正则表达式 ,指定文件类型等。
UPDATE
我刚刚发现了The Silver Searcher ,它类似于 ack 但比它快 3-5 倍,甚至忽略了.gitignore
文件中的模式。