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


13

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

ls */*.png

工作良好。

ls (^one)*/*.png

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

我是盲人,并将其传送到espeak,所以现在我只能听到stdout。


您正在使用哪个外壳?您的模式看起来像zsh模式,尽管它不是有用的模式,因为它不会排除one(正确的模式是^one/*.png),它将打印所有内容。
吉尔斯(Gilles)'所以

Answers:


16

选项1-仅使用ls
在扩展的bash锁定启用(shopt -s extglob)的情况下,您可以执行以下操作:

ls !(one*)/*.png


选项2-合并lsgrep

您可以lsgrep -v

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


选项3-(最佳IMO),但find不使用ls

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

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


以上所有一线代码都将列出带有.png文件的目录,同时过滤掉所有匹配的路径one/;只有选项3会递归执行此操作。


find命令不需要说-path "*/one/*"还是-path "./one/*"
G-Man说'Resstate Monica''Aug

@ G-Man你是完全正确的。上面编辑。
toxefa

那还不匹配./phone/handset.png吗?
G-Man说'Resstate Monica''Apr

@ G-Man匹配.png目录中的s有什么问题phone?我以为我们只是想排除one
toxefa

1
好的,因为您正在与结合使用它-not,这意味着它会导致find排除目录中名为的文件phone
G-Man说'Resstate Monica''Apr

6

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

ls ^one/*.png

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

ls ^one/**/*.png

要排除名为的子目录中的文件one,而不排除其子目录中的文件,请执行以下操作:

ls **/^one/*.png

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

ls (^one/)#/*.png
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.