如何使用tree命令精准排除指定子目录(test/raw与test/b/data)
精准排除指定目录的tree命令用法
先执行以下命令创建测试目录结构:
me@s:/tmp$ mkdir -p test/raw test/{a,b,c}/data/x me@s:/tmp$ tree test/ test/ ├── a │ └── data │ └── x ├── b │ └── data │ └── x ├── c │ └── data │ └── x └── raw
需求是排除test/raw和test/b/data目录,但tree的-I选项默认仅匹配目录/文件的名称,直接使用tree test -I 'raw|b/data'无法达到预期效果——因为b/data是路径而非单一目录名,执行后test/b/data依然会被显示:
me@s:/tmp$ tree test -I 'raw|b/data' test ├── a │ └── data │ └── x ├── b │ └── data │ └── x └── c └── data └── x
如果改用raw|data作为匹配规则,又会错误排除所有data目录:
me@s:/tmp$ tree test -I 'raw|data' test ├── a ├── b └── c me@s:/tmp$
解决方法
方法一:结合find与tree的--fromfile选项
利用find的路径筛选能力先过滤掉目标目录,再将结果传给tree显示:
find test -path "test/raw" -prune -o -path "test/b/data" -prune -o -print | tree --fromfile
执行后会得到预期的目录结构:
test ├── a │ └── data │ └── x ├── b └── c └── data └── x
方法二:使用tree的--matchdirs选项(需新版本tree支持)
该选项会让-I的匹配规则作用于完整路径而非仅节点名称,直接执行以下命令即可:
tree test --matchdirs -I 'raw|b/data'
内容的提问来源于stack exchange,提问作者user3313834
相关产品推荐
相关产品推荐

