我想查找包含特定文本字符串的所有文件。该grep
命令有效,但我不知道如何将其用于每个目录(我只能对当前目录执行此操作)。我尝试阅读man grep
,但没有任何帮助。
答案1
最好使用
grep -rl "string" /path
在哪里
-r
(或--recursive
)选项用于遍历的所有子目录/path
,而-l
(或--files-with-matches
)选项用于仅打印匹配文件的文件名,而不是匹配的行(这也可以提高速度,因为使用grep
此选项在第一次匹配时停止读取文件)。
答案2
如果您正在寻找文件中匹配的行,我最喜欢的命令是:
grep -Hrn 'search term' path/to/files
-H
导致打印文件名(搜索多个文件时隐含)-r
进行递归搜索-n
打印行号
path/to/files
可以.
在当前目录中搜索
我发现非常有用的更多选项:
-I
忽略二进制文件(补充:-a
将所有文件视为文本)-F
视为search term
文字,而不是正则表达式-i
进行不区分大小写的搜索--color=always
强制颜色,即使在通过管道传输时也是如此less
。要制作less
支持颜色,您需要使用以下-r
选项:grep -Hrn search . | less -r
--exclude-dir=dir
对于排除.svn
和之类的目录很有用.git
。
答案3
我相信您可以使用这样的东西:
find /path -type f -exec grep -l "string" {} \;
评论的解释
find
是一个命令,它允许您查找文件和其他对象(例如给定路径的子目录中的目录和链接)。如果您未指定文件名应满足的掩码,它将枚举所有目录对象。
-type f
指定它应该只处理文件,而不是目录等。-exec grep
指定对于每个找到的文件,它都应该运行 grep 命令,将其文件名作为参数传递给它,方法是将其替换{}
为文件名
答案4
如果你愿意尝试新事物,那就ack
一枪。递归搜索当前目录的命令string
是:
ack string
安装非常简单:
curl http://betterthangrep.com/ack-standalone > ~/bin/ack && chmod 0755 !#:3
(假设您已经获得目录~/bin
并且它最好在您的中PATH
。)