使用 grep 在目录中递归搜索,忽略单个文件

使用 grep 在目录中递归搜索,忽略单个文件

有没有一种方法可以让 grep 搜索整个目录,但忽略一个文件中的匹配项?

我正在使用的命令是:

grep -rn 'SearchTextHere'

我需要忽略的文件有一个奇怪的文件名:=.

是的,文件名只是一个等号。是啊,我也不懂。

(不确定它是否应该存在,所以我不能直接删除它。我不认为这是一个意外的 grep 管道传输到文件或类似的东西。)

grep 版本 3.4

答案1

=如果出现以下情况,则可以出现 - 命名的文件:

[ a >= b ]

或者:

expr a >= b

错误地,因为这本质上是相同的:

[ a b ] > '='
expr a b > '='

即运行这些[expr命令,并将其输出重定向到=.由于>是 shell 语法中的重定向运算符,>应加引号:

expr a '>=' b
[ a '>=' b ]

(尽管很少[有实现支持>=运算符;yash的内置功能[

如果=您的该文件是空的,这是一种可能的解释。

=现在要排除在 GNU 递归搜索中调用的任何文件grep,您可以使用:

grep -rn --exclude== SearchTextHere .

或者:

grep -rn --exclude = SearchTextHere .

--exclude-from适用于当您想要在文件中给出排除列表时。在这里,虽然你可以这样做:

echo = | grep --exclude-from=/dev/stdin -rn SearchTextHere .

这比使用--exclude.

无论如何,没有办法告诉 GNU仅排除当前目录中的grep -r文件(并且仍然在其他子目录中找到的文件中搜索)。为此,您可以使用查找文件并排除并让它调用来搜索文件中的文本,就像您通常所做的那样,这不是标准选项。==find=grep-rgrep

find . ! -path './=' -type f -exec grep -n SearchTextHere /dev/null {} +

(添加的/dev/null保证grep将始终打印文件的名称,即使find只找到一个文件;使用 GNU grep,您也可以使用该-H选项)。

或者跳过目录调用=以及其中的任何文件(这grep --exclude =不起作用):

find . -name = -prune -o -type f -exec grep -rn /dev/null {} +

(这里跳过任何文件/目录名为=.用于-path ./=仅跳过=当前目录中的目录)。

答案2

看起来 Steeldriver 的评论建议有效:

grep -rn 'SearchTextHere' --exclude==

或者我想对于一个普通的文件名来说是

grep -rn 'SearchTextHere' --exclude=FileToIgnore

我试图使用手册页中的“--exclude-from”。不知道那是做什么用的。

相关内容