如何在grep命令中排除嵌套目录?

时间:2019-01-25 15:57:14

标签: linux bash grep

我想在当前目录及其子文件夹中搜索单词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 做到这一点?

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

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

grep相反,此命令将不跟随符号链接,根据您的需要,这可能不是好事。如果需要关注,请使用-L选项。

答案 2 :(得分:0)

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

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

 --exclude-dir=PATTERN

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

因此,只要了解这一点,就意味着该选项对于此上下文是无用的。但是我们必须以某种方式扩展“线索”,并让命令确切地知道我们要搜索的目录。首先,再看看grep命令的语法,

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

TL; DR 我的操作方式是

grep -r disable_mlock ?/vault/config

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