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

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

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

ls */*.png

工作正常。

ls (^one)*/*.png

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

我是盲目的,并且通过管道将其传输到espeak,所以我现在只能听到标准输出。

答案1

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

ls !(one*)/*.png


选项2- 结合lsgrep

您可以ls结合grep -v

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


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

使用以下命令递归搜索所有子目录find

find . -type f -name "*.png" -not -path "*/one/*"


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

答案2

桀骜, 放setopt extended_glob在你的~/.zshrc。然后您可以使用通配符模式 ^one排除名为 的目录one

ls ^one/*.png

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

ls ^one/**/*.png

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

ls **/^one/*.png

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

ls (^one/)#/*.png

相关内容