我正在尝试内部ls
包含.png
文件的目录(不需要递归,尽管它会特别有用),除了一个。排除一个目录,即
ls */*.png
工作正常。
ls (^one)*/*.png
不返回标准输出。我该如何实现它?
我是盲目的,并且通过管道将其传输到espeak
,所以我现在只能听到标准输出。
答案1
选项1- 仅使用ls
:
打开扩展 bash 通配符 ( shopt -s extglob
),您可以执行以下操作:
ls !(one*)/*.png
选项2- 结合ls
和grep
:
您可以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