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

pai*_*lee 55 bash ls glob wildcard

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

ls *.jar
Run Code Online (Sandbox Code Playgroud)

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

小智 71

使用egrep样式的扩展模式匹配.

ls !(*.jar)
Run Code Online (Sandbox Code Playgroud)

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

shopt -s extglob
Run Code Online (Sandbox Code Playgroud)

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

  • 这是正确的答案.标记为正确的答案不直接使用shell,它使用辅助命令. (2认同)

Mic*_*ker 55

ls | grep -v '\.jar$'
Run Code Online (Sandbox Code Playgroud)

例如.

  • [不要解析`ls`的输出](http://mywiki.wooledge.org/ParsingLs),谢谢. (5认同)
  • 什么是grep的-v标志? (2认同)
  • @ Silver89,`ls | grep -v -e'\ .one $'-e'\ .two $'`例如. (2认同)
  • 使用ls --ignore ='\.jar'以防止必须调用另一个程序会更有效. (2认同)

cca*_*ton 33

鲜为人知的bash扩展规则:

ls !(*.jar)
Run Code Online (Sandbox Code Playgroud)

  • 首先尝试在命令行上执行'shopt -s\textglob',然后输入命令. (7认同)
  • bash:!:找不到事件.我需要什么? (2认同)

ste*_*nct 17

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

ls *[!j][!a][!r]
Run Code Online (Sandbox Code Playgroud)

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

  • 这与短于三个字符的内容不匹配。 (2认同)

Dan*_*ego 15

使用适当的版本find,你可以做这样的事情,但它有点矫枉过正:

find . -maxdepth 1 ! -name '*.jar'
Run Code Online (Sandbox Code Playgroud)

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

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


haa*_*vee 6

如果您ls支持 ( man ls),请使用该--hide=<PATTERN>选项。在你的情况下:

$> ls --hide=*.jar
Run Code Online (Sandbox Code Playgroud)

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

$> ls src --hide=*.{lo,c,h,o}
Run Code Online (Sandbox Code Playgroud)

工作起来就像一个魅力。


Div*_*ava 6

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

ls -I '*.jar'
Run Code Online (Sandbox Code Playgroud)