![如何排除树中的多个文件扩展名?](https://linux22.com/image/1569390/%E5%A6%82%E4%BD%95%E6%8E%92%E9%99%A4%E6%A0%91%E4%B8%AD%E7%9A%84%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%90%8D%EF%BC%9F.png)
使用 tree 命令时,我想从输出中排除列表*.png
和*.svg
。问题是我尝试的每个括号扩展都不起作用。这是因为 tree 处理命令行参数的方式吗?
tree -I *.{svg,png}
tree -I '*.{svg,png}'
tree -I '{*.svg,*.png}'
tree -I '{*.svg,*.png}'
tree -I '*.{p,s}(v,n}g'
tree -I '*.{svg|png}'
眼镜:
- GNU bash,版本 4.4.23
- 树 v1.7.0
答案1
-I
是...的倒数-P
,手册提供了有关后者可接受内容的更多信息:
https://linux.die.net/man/1/tree
-P pattern
仅列出与通配符模式匹配的文件。
注意:您必须使用该
-a
选项来考虑以点开头的文件.
进行匹配。有效的通配符运算符为
*
(任何零个或多个字符)、?
(任何单个字符)、[...]
(括号内列出的任何单个字符(-
可以使用可选的(破折号)表示字符范围:例如[A-Z]
:)和[^...]
(括号中未列出的任何单个字符)并|
分隔替代模式。
没有提到壳牌的括号扩展...的语法{a,b}
此扩展由 处理tree
,而不是bash
。
不幸的是您不能指定-I
多次......
相反,您需要列出完整的模式并使用竖线 ( |
) 来分隔它们:
tree -I '*.svg|*.png'
注意使用单引号来防止 shell 扩展星号 ( *
) 或变量(由美元符号 - 引入$
)。
还要注意,甚至不可能强制 shell 的括号扩展,如下所示:
$ tree -I '*.'{svg,png}
+ tree -I '*.svg' '*.png'
*.png [error opening dir]