我想在当前目录及其子文件夹中搜索单词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 做到这一点?
答案 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
我只是使用了专用文件路径名。问号(?)是通配符,代表“单个字符”。那是因为我知道我要搜索的所有目录,它们的名称只有一个字母。