2011-12-15 32 views
46

下面是一个可能会列出在bash所有匹配模式的文件:列表文件不符合模式?

ls *.jar 

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

+0

这可能不应该被标记为正则表达式,*是一个shell-globbing通配符,并且不是正则表达式*,它是“零个或多个量词”。 – sweaver2112 2011-12-15 19:57:15

+0

好点,虽然我知道使用正则表达式可能是更好的练习来获得你期望的比赛。 – paislee 2011-12-15 20:04:01

回答

38
ls | grep -v '\.jar$' 

例如。

+2

什么是grep的-v标志? – paislee 2011-12-15 19:24:49

+12

颠倒匹配。还有一个“男人grep”。 – 2011-12-15 19:26:08

+0

你怎么能做两个文件类型? – Dan 2012-11-29 01:12:31

2

一个解决办法是ls -1|grep -v '\.jar$'

13

随着find合适的版本,你可以做这样的事情,但它是一个有点矫枉过正:

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

find找到文件。 .参数指定您要从.开始搜索,即当前目录。 -maxdepth 1告诉它你只想搜索一个深度,即当前目录。 ! -name '*.jar'寻找所有文件不要匹配正则表达式*.jar

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

27

鲜为人知的bash展开规则:

ls !(*.jar) 
58

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

ls !(*.jar) 

这是开始与bash-2.02-alpha1。 必须首先用

shopt -s extglob 

随着庆典-4.1-α的有一个配置选项,默认情况下启用此功能。

14

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

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

尽管这有一些怪癖,但至少它与任何unix shell都兼容。

1

如果您想要排除多个文件扩展名,请使用管道|分隔它们,如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第一。