如何使用“grep”命令查找包含子目录的文本

如何使用“grep”命令查找包含子目录的文本

我想查找包含特定文本字符串的所有文件。该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。)

相关内容