以下是如何在bash中列出所有符合模式的文件:
ls *.jar
如何列出与模式不匹配的所有文件?即所有不匹配*.jar的文件?
使用 egrep 风格的扩展模式匹配。
ls !(*.jar)
这个功能从bash-2.02-alpha1版本开始可用。 必须先启用它。
shopt -s extglob
从bash-4.1-alpha开始,有一个配置选项可以默认启用此功能。
ls | grep -v '\.jar$'
例如。
ls | grep -v -e '\.one$' -e '\.two$'
。 - Michael Krelin - hackerls
命令的输出结果。 - gniourf_gniourf鲜为人知的bash扩展规则:
ls !(*.jar)
使用适当版本的find
,您可以做出类似这样的操作,但这有点过度:
find . -maxdepth 1 ! -name '*.jar'
find
命令可以查找文件。参数 .
表示从当前目录开始搜索。选项 -maxdepth 1
表示只搜索一层,即当前目录。! -name '*.jar'
查找所有不符合正则表达式 *.jar
的文件。
虽然对于这个应用程序来说有点过度,但是如果你去掉 -maxdepth 1
,就可以轻松地递归搜索所有非 jar 文件或其他内容了。
POSIX定义了不匹配的括号表达式,所以我们可以让Shell为我们扩展文件名。
ls *[!j][!a][!r]
尽管这有一些怪癖,但至少它与任何unix shell兼容。
ls -I
标志(忽略模式)来实现。ls -I '*.jar'
ls
支持它(man ls
),请使用--hide=<PATTERN>
选项。在您的情况下:$> ls --hide=*.jar
不需要解析ls
的输出(因为它很糟糕),而且它可以扩展到不显示多种类型的文件。有时我需要查看一个(杂乱无章的)目录中非源代码、非对象、非libtool生成的文件:
$> ls src --hide=*.{lo,c,h,o}
效果很棒。
如果你想要排除多个文件扩展名,可以使用管道符|
进行分隔,例如: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
。
!(*.[bj]ar)
。 - Benjamin W.ls -1|grep -v '\.jar$'
。ls
的输出,谢谢。 - gniourf_gniourfls
或使用 goto
这样的规则持宗教般的态度。有时这些解决方案效果最好。 - Jonathan E. Landrumfind -print0
和 grep -z
”。 - Daniel Hls -I "*.jar"
-I, --ignore=PATTERN
:不列出与 shell 模式匹配的隐含条目watch -d 'ls -I "*.gz"'
,不像 watch 'ls !(*.jar)'
会产生错误:sh: 1: Syntax error: "(" unexpected
注意:由于某种原因,在 Centos 中需要在
-I
后引用模式,而在 Ubuntu 中则不需要。