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