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

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

ls *.jar

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

77096 次浏览
ls | grep -v '\.jar$'

比如说。

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

使用适当版本的 find,你可以做这样的事情,但是有点过头了:

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

find查找文件。.参数指定要从 .开始搜索,也就是工作目录。-maxdepth 1告诉它你只想搜索一层深度,也就是工作目录。! -name '*.jar'查找与 不要匹配的正则表达式 *.jar的所有文件。

正如我所说的,对于这个应用程序来说有点过分,但是如果删除了 -maxdepth 1,那么就可以递归地搜索所有非 jar 文件或者其他容易找到的文件。

鲜为人知的 bash 扩展规则:

ls !(*.jar)

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

ls !(*.jar)

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

shopt -s extglob

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

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

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

尽管这有一些怪异之处,但至少它与任何 unixshell 都兼容。

如果您想排除多个文件扩展名,可以使用管道 |(如 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标志(Ignore-pattern)。

ls -I '*.jar'

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

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

但这似乎只在 bash 上有效,而在 bash 和 zsh 上似乎都有效:

ls -d *.[^j][^a][^r]
ls -I "*.jar"

- 我,——忽略 = 模式
不要列出与 shell PATTERN 相匹配的隐含条目

  • 它可以在不执行任何操作的情况下工作
  • 它也在手表引号内工作: watch -d 'ls -I "*.gz"',不像 watch 'ls !(*.jar)'生成: sh: 1: Syntax error: "(" unexpected

注意: 由于某些原因,Centos 需要在 -I之后引用模式,而 Ubuntu 不需要