我正在尝试里面ls
有.png
文件的目录(不需要递归,尽管它会额外有用),第一个。排除一个目录即
ls */*.png
工作良好。
ls (^one)*/*.png
不返回任何标准输出。我该如何实现?
我是盲人,并将其传送到espeak
,所以现在我只能听到stdout。
我正在尝试里面ls
有.png
文件的目录(不需要递归,尽管它会额外有用),第一个。排除一个目录即
ls */*.png
工作良好。
ls (^one)*/*.png
不返回任何标准输出。我该如何实现?
我是盲人,并将其传送到espeak
,所以现在我只能听到stdout。
Answers:
选项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会递归执行此操作。
find
命令不需要说-path "*/one/*"
还是-path "./one/*"
?
./phone/handset.png
吗?
.png
目录中的s有什么问题phone
?我以为我们只是想排除one
?
-not
,这意味着它会导致find
排除目录中名为的文件phone
。
在zsh中,放入setopt extended_glob
您的~/.zshrc
。然后,您可以使用通配符模式 ^one
排除名为的目录one
。
ls ^one/*.png
如果要递归到子目录,请使用**/
递归glob。要排除one
在顶层调用的目录以及顶层目录:
ls ^one/**/*.png
要排除名为的子目录中的文件one
,而不排除其子目录中的文件,请执行以下操作:
ls **/^one/*.png
要排除one
在任何级别调用的子目录下的文件,请对#
运算符使用否定重复模式:
ls (^one/)#/*.png
one
(正确的模式是^one/*.png
),它将打印所有内容。