如何在Linux上找到包含特定文本的所有文件?

我试图找到一种方法来扫描我的整个Linux系统,以寻找包含特定文本字符串的所有文件。澄清一下,我正在寻找文件中的文本,而不是文件名中的文本。

当我在查找如何做到这一点时,我两次遇到了这个解决方案。

find / -type f -exec grep -H 'text-to-find-here' {} \;

然而,这并不奏效。它似乎显示了系统中的每一个文件。

这是否接近于正确的方法?如果不是,我应该怎么做?这种在文件中查找文本字符串的能力对于我正在做的一些编程项目来说是非常有用的。

解决办法

做到以下几点。

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r-R是递归。
  • -n是行号,并且
  • -w代表匹配整个单词。
  • -l(小写字母L)可以被添加到只给出匹配文件的文件名。

除此以外,还可以使用--排除'、--包括'、`--排除--目录'标志来进行有效搜索。

  • 这将只搜索那些具有.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

评论(36)

你可以使用grep -ilR

grep -Ril "text-to-find-here" /
  • i代表忽略的情况(在你的情况下是可选的)。
  • R代表递归。
  • l代表"显示文件名,而不是结果本身"。
  • /代表从机器的根开始。
评论(29)

你可以使用ack。它就像源代码的grep。你可以用它来扫描你的整个文件系统。

就这样做。

ack 'text-to-find-here'

在你的根目录下。

你也可以使用正则表达式,指定文件类型,等等。


更新

我刚刚发现了 The Silver Searcher,它就像 ack,但比它快 3-5 倍,甚至可以忽略来自 .gitignore 文件的模式。

评论(3)