列出与模式不匹配的文件?

时间:2011-12-15 19:20:20

标签: bash wildcard glob ls

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

ls *.jar

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

10 个答案:

答案 0 :(得分:67)

使用egrep风格的扩展模式匹配。

ls !(*.jar)

这是从bash-2.02-alpha1开始提供的。 首先必须启用

shopt -s extglob

从bash-4.1-alpha开始,默认情况下会有一个配置选项来启用它。

答案 1 :(得分:52)

ls | grep -v '\.jar$'
例如

答案 2 :(得分:33)

鲜为人知的bash扩展规则:

ls !(*.jar)

答案 3 :(得分:17)

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

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

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

答案 4 :(得分:15)

使用适当版本的find,您可以执行类似的操作,但这有点过分:

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

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

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

答案 5 :(得分:2)

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

答案 6 :(得分:2)

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

答案 7 :(得分:2)

如果您的ls支持(man ls),请使用--hide=<PATTERN>选项。就您而言:

$> ls --hide=*.jar

无需解析ls的输出(因为它非常糟糕),并且可以扩展为不显示多种类型的文件。在某个时候,我需要查看(混乱的)目录中有哪些非源,非对象,非libtool生成的文件:

$> ls src --hide=*.{lo,c,h,o}

像魅力一样工作。

答案 8 :(得分:1)

一些提到的这种形式的变体:

ls -d *.[!j][!a][!r]

但这似乎只适用于 bash,而这似乎适用于 bash 和 zsh:

ls -d *.[^j][^a][^r]

答案 9 :(得分:0)

另一种方法可以使用ls -I标志(忽略模式)。

ls -I '*.jar'