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开始,默认情况下会有一个配置选项来启用它.
Mic*_*ker 55
ls | grep -v '\.jar$'
Run Code Online (Sandbox Code Playgroud)
例如.
cca*_*ton 33
鲜为人知的bash扩展规则:
ls !(*.jar)
Run Code Online (Sandbox Code Playgroud)
ste*_*nct 17
POSIX定义了不匹配的括号表达式,因此我们可以让shell为我们扩展文件名.
ls *[!j][!a][!r]
Run Code Online (Sandbox Code Playgroud)
这有一些怪癖,但至少它与任何unix shell兼容.
Dan*_*ego 15
使用适当的版本find,你可以做这样的事情,但它有点矫枉过正:
find . -maxdepth 1 ! -name '*.jar'
Run Code Online (Sandbox Code Playgroud)
find找到文件.该.参数指定要开始搜索.,即当前目录.-maxdepth 1告诉它你只想搜索一个级别,即当前目录.! -name '*.jar'查找与正则表达式不匹配的所有文件*.jar.
就像我说的那样,对于这个应用程序来说有点过分,但是如果你删除它-maxdepth 1,你可以递归搜索所有非jar文件或者你有什么容易.
如果您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)
工作起来就像一个魅力。