我试图找到一种方法来扫描我的整个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'
在你的根目录下。
您还可以使用正则表达式,指定文件类型等。
您可以使用:
grep -r "string to be searched" /path/to/dir
r递归的立场,所以将搜索指定的路径和其子目录。这会告诉你文件名,并在字符串出现的文件中打印出该行。
或者一个类似于你正在尝试的命令(例如:)在所有JavaScript文件(* .js)中搜索的命令:
find . -name '*.js' -exec grep -i 'string to search for' {} \; -print
这将打印出现文本的文件中的行,但不会打印文件名。