以下是如何列出与bash中的模式匹配的所有文件:
ls *.jar
如何列出模式的补充?即所有文件都不匹配* .jar?
ls | grep -v '\.jar$'
例如。
使用egrep样式的扩展模式匹配。
ls !(*.jar)
这是从bash-2.02-alpha1开始提供的。首先必须启用
shopt -s extglob
从bash-4.1-alpha开始,默认情况下会有一个配置选项来启用它。
鲜为人知的bash扩展规则:
ls !(*.jar)
POSIX定义了不匹配的括号表达式,因此我们可以让shell为我们扩展文件名。
ls *[!j][!a][!r]
这有一些怪癖,但至少它与任何unix shell兼容。
使用适当版本的find
,你可以做这样的事情,但它有点矫枉过正:
find . -maxdepth 1 ! -name '*.jar'
find
找到文件。 .
参数指定您要从.
开始搜索,即当前目录。 -maxdepth 1
告诉它你只想搜索一个级别,即当前目录。 ! -name '*.jar'
查找与正则表达式*.jar
不匹配的所有文件。
就像我说的那样,这个应用程序有点过分,但是如果你删除了-maxdepth 1
,你可以递归搜索所有非jar文件或者你有什么容易。
一个解决方案是ls -1|grep -v '\.jar$'
如果要排除多个文件扩展名,请使用管道|
(如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
。
如果你的ls
支持它(man ls
)使用--hide=<PATTERN>
选项。在你的情况下:
$> ls --hide=*.jar
无需解析ls
的输出(因为它非常糟糕)并且它扩展为不显示多种类型的文件。在某些时候,我需要查看(乱码)目录中的非源,非对象,非libtool生成的文件:
$> ls src --hide=*.{lo,c,h,o}
工作就像一个魅力。
另一种方法可以使用ls -I
标志(忽略模式)。
ls -I '*.jar'