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

linux text grep directory find


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

当我在寻找这个办法的时候,我遇到了两次这个办法。

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

然而,它并不工作。它似乎可以显示系统中的每一个文件。

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




Answer 1 rakib_


做到以下几点:

grep -rnw '/path/to/somewhere/' -e 'pattern'
  • -r-R 是递归的,
  • -n 是行号,并且
  • -w 表示匹配整个单词。
  • -l 可以添加-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 参数排除特定目录。例如,这将排除dirs dir1 /,dir2 /及其全部与* .dst /匹配的目录:

    grep --exclude-dir={dir1,dir2,*.dst} -rnw '/path/to/somewhere/' -e "pattern"
    

这对我来说效果很好,能达到和你差不多的目的。

有关更多选项,请检查 man grep




Answer 2 fedorqui 'SO stop harming'


您可以使用 grep -ilR

grep -Ril "text-to-find-here" /
  • i 代表忽略大小写(在您的情况下是可选的)。
  • R 代表递归。
  • l 代表“显示文件名,而不是结果本身”。
  • / 表示从计算机的根目录开始。



Answer 3 Stephan


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

只是做。

ack 'text-to-find-here'

在你的根目录中。

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


UPDATE

我刚刚发现了Silver Searcher,它像ack一样,但比它快3-5倍,甚至忽略了 .gitignore 文件中的模式。




Answer 4 learner_19


你可以使用。

grep -r "string to be searched"  /path/to/dir

r 代表递归等都将在指定的路径以及它的子目录搜索。这将告诉您文件名,并打印出文件中出现字符串的行。

或者使用类似于你正在尝试的命令(例如:),在所有的javascript文件(*.js)中搜索。

find . -name '*.js' -exec grep -i 'string to search for' {} \; -print

这将打印文本出现的文件中的行,但不会打印文件名。

除了此命令外,我们也可以编写以下命令: grep -rn“要搜索的字符串” / path / to /目录/或/ file -r:递归搜索n:将显示匹配的行号




Answer 5 A R


你可以使用这个。

grep -inr "Text" folder/to/be/searched/