列出不符合模式的文件?

以下是如何列出与bash中的模式匹配的所有文件:

ls *.jar 

如何列出模式的补码? 即所有文件不匹配* .jar?

 ls | grep -v '\.jar$' 

例如。

使用egrep样式的扩展模式匹配。

 ls !(*.jar) 

这可以从bash-2.02-alpha1开始。 必须先启用

 shopt -s extglob 

从bash-4.1-alpha开始,有一个configuration选项来默认启用它。

鲜为人知的bash扩展规则:

 ls !(*.jar) 

用适当版本的find ,你可以做这样的事情,但这有点矫枉过正:

 find . -maxdepth 1 ! -name '*.jar' 

findfind的文件。 的. 参数指定您想要从中开始search. 即当前目录。 -maxdepth 1告诉它你只想search一个深度,即当前目录。 ! -name '*.jar' ! -name '*.jar'查找与正则expression式*.jar 匹配的所有文件。

就像我说的,这个应用程序有点矫枉过正,但是如果你删除了-maxdepth 1 ,那么你可以recursion地search所有非jar文件或者你有什么容易的。

POSIX定义了不匹配的括号expression式,所以我们可以让shell为我们扩展文件名。

 ls *[!j][!a][!r] 

这虽然有一些怪癖,但至less它与任何unix shell都兼容。

一种解决scheme是ls -1|grep -v '\.jar$'

如果要排除多个文件扩展名,请使用pipe道将它们分开 ,就像ls test/!(*.jar|*.bar) 。 让我们试试看:

 $ mkdir test $ touch test/1.jar test/1.bar test/1.foo $ ls test/!(*.jar|*.bar) test/1.foo 

查看其他答案,您可能需要首先shopt -s extglob