【问题标题】:How to exclude nested directories in grep command?如何在 grep 命令中排除嵌套目录?
【发布时间】:2019-01-25 15:57:13
【问题描述】:

我想在当前目录及其子文件夹中搜索单词disable_mlock。为此,我使用:

sam@sam-Dell:~/Desktop$ grep -r disable_mlock
a/vault/config/vault-config.hcl:disable_mlock=true
b/vault/config/vault-config.hcl:disable_mlock=true
vault/config/vault-config.hcl:disable_mlock=true

然后,我只想排除 vault/config/ 子目录:

sam@sam-Dell:~/Desktop$ grep -r --exclude-dir=vault/config/
a/vault/config/vault-config.hcl:disable_mlock=true
b/vault/config/vault-config.hcl:disable_mlock=true
vault/config/vault-config.hcl:disable_mlock=true

而且它不起作用。

然后我尝试仅排除 vault/ 目录:

sam@sam-Dell:~/Desktop$ grep -r disable_mlock --exclude-dir=vault
sam@sam-Dell:~/Desktop$

它什么也不返回...可能是因为vault/ 在每个结果的路径中。

如果我排除config/

sam@sam-Dell:~/Desktop$ grep -r disable_mlock --exclude-dir=config/
sam@sam-Dell:~/Desktop$

也不显示任何结果 - 所有匹配项都位于 config/ 目录下。但我只想排除其中一个config/ 目录,vault/config/,而不是全部!

我的结论是 grep 一次只能排除一个目录,无论是直接目录还是深层目录,都相对于当前目录。在这种情况下,这对我来说是个问题,因为我的路径具有相似的目录。

那么,我找不到使用grep排除特定嵌套子目录的方法。有没有办法使用 grep

【问题讨论】:

  • @MTilsted 没看懂,试过grep disable_mlock --exclude-dir=vault/ * */ *还是不行
  • 您可以重新 grep 输出并排除该短语吗?
  • 在这种特殊情况下,您不妨使用这个简单的 glob:grep -r disable_mlock */vault/config
  • 您可以使用find 对找到的文件执行grep 吗?请记住,如果您希望 grep 打印文件名,则需要指定 -H。

标签: linux bash grep


【解决方案1】:

您是在命令中接受管道还是希望一次性完成? 带管道:

grep -r disable_mlock * | egrep -v "^vault"

【讨论】:

    【解决方案2】:

    GNU find 提供了比 grep 更多的选项来排除路径:

    find -path ./vault/config -prune -o -type f -exec grep pattern {} +
    

    -prune 结合-path path_expression 指示find 忽略指定的路径。 -exec grep ... 进行实际搜索。

    这个命令不会跟随符号链接,与grep相反,这可能是也可能不是一件好事,这取决于你的需要。如果您需要关注他们,请使用-L 选项。

    【讨论】:

      【解决方案3】:

      我假设您严格想要使用grep 命令,这意味着没有管道或其他可以更好地工作的替代命令。如果您赶时间,请查看最后的代码。

      首先,请注意!如果您查看grep 命令的手册页,您会发现--exclude-dir 选项的语法,

       --exclude-dir=PATTERN
      

      这意味着选项only接受模式作为输入。您不能为其使用 路径名。这就是为什么您使用--exclude-dir=vault/config 进行的搜索不起作用的原因。因为它没有排除 Vault 目录中的 config 子目录,所以它实际上排除了名称中包含“vault/config”但没有的每个目录。

      因此,通过了解这一点,它仅意味着该选项对于这种情况是无用的。但是我们必须以某种方式扩展“线索”并让命令准确地知道我们想要搜索哪些目录。首先,再看看grep的命令语法,

      grep [OPTION]... PATTERN [FILE]...
      

      TL;DR我这样做的方式是,

      grep -r disable_mlock ?/vault/config
      

      我只是使用了一个独占的文件路径名。问号 (?) 是一个通配符,代表“单个字符”。那是因为我知道所有要搜索的目录,名字只有一个字母。

      【讨论】:

        猜你喜欢
        • 2011-05-11
        • 2021-04-01
        • 2011-09-27
        • 2015-03-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 2015-02-05
        相关资源
        最近更新 更多