如何反转grep表达式

314

以下grep表达式可以成功列出当前目录及其子目录中所有的.exe和.html文件。

ls -R |grep -E .*[\.exe]$\|.*[\.html]$  

如何反转此结果以列出那些不是 .html 或 .exe 的文件(即,!=)。

5个回答

438

使用命令行选项-v--invert-match

ls -R |grep -v -E .*[\.exe]$\|.*[\.html]$

15
需要注意的是,-v/ --invert-match 选项并不一定会翻转 grep 命令的返回值,表明执行是否成功,而是匹配那些本来不匹配的行。如果想要翻转返回值(即在所有行都不匹配模式时才算成功,而不是至少有一个),应该使用 ! grep 命令。这在条件表达式中很有用,例如:if ! ls | grep -qE ".(\.exe)$"; then echo No .exe files in $(pwd); fi - Zyl
我无法让上述内容正常工作,但是以下命令可以:ls -R | grep -v -E ".*(\.exe)$|.*(\.vue)$" - mlunoe

128
grep -v
或者
grep --invert-match
您也可以使用find来完成同样的操作:
find . -type f \( -iname "*" ! -iname ".exe" ! -iname ".html"\)

更多信息请点击这里


3
“find”命令是解决这个XY问题最语义化的解决方案。将“ls”和“grep”结合起来使用似乎最多只是一种hacky的解决方法。这应该是被接受的答案。(+1) - Eric Seastrand
5
不论原帖的要求是什么,倒置 grep 表达式不仅适用于查找文件,而且还有很多其他用途。我怀疑这不是大多数人来这里的原因。 - byxor

37
-v选项添加到您的grep命令中以反转结果。

24

如多次说明的那样,通过 -v 选项可以实现反向匹配。让我补充一下(希望有趣)注意,您可以通过在 grep 帮助文本中进行 grep 来自己找到这个选项:

grep --help | grep invert

-v,--invert-match选择不匹配的行


16
 grep "subscription" | grep -v "spec"  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接