在 `ls` 匹配模式中排除一个目录

Tom*_*kus 13 ls shell wildcards

我正在尝试使用里面ls.png文件的目录(不需要递归,尽管它会特别有用),除了一个。排除一个目录即

ls */*.png
Run Code Online (Sandbox Code Playgroud)

工作正常。

ls (^one)*/*.png
Run Code Online (Sandbox Code Playgroud)

不返回标准输出。我如何实现它?

我是瞎子,用管道把它传到espeak,所以我现在只能听到标准输出。

tox*_*efa 16

选项 1 - 仅使用ls
打开扩展 bash globbing ( shopt -s extglob) 您可以执行以下操作:

ls !(one*)/*.png
Run Code Online (Sandbox Code Playgroud)


选项 2 - 结合lsgrep

您可以结合ls使用grep -v

  • 例如 ls */*.png | grep -v "one/"


选项 3 -(最好的 IMO)但find不使用ls

使用递归搜索所有子目录 find

find . -type f -name "*.png" -not -path "*/one/*"
Run Code Online (Sandbox Code Playgroud)


以上所有单行程序都会列出包含.png文件的目录,同时过滤掉任何匹配的路径one/;只有选项 3 会递归地执行此操作。


Gil*_*il' 6

zsh 中,放入setopt extended_glob您的~/.zshrc. 然后您可以使用通配符模式 ^one排除名为one.

ls ^one/*.png
Run Code Online (Sandbox Code Playgroud)

如果要递归到子目录,请使用**/递归通配符。要排除one在顶层调用的目录以及顶层目录:

ls ^one/**/*.png
Run Code Online (Sandbox Code Playgroud)

要排除名为 的子目录中的文件one,但不排除其子目录中的文件:

ls **/^one/*.png
Run Code Online (Sandbox Code Playgroud)

要排除one在任何级别调用的子目录下的文件,请使用重复模式和#否定周围的运算符:

ls (^one/)#/*.png
Run Code Online (Sandbox Code Playgroud)