有没有一种方法可以让 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
-r
grep
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”。不知道那是做什么用的。