排除树命令的子目录模式不起作用

排除树命令的子目录模式不起作用

我正在尝试使用 tree 命令列出我当前的 git 目录。

我想排除与 gitignore 模式匹配的每个文件。找到了解决方案这里看起来很有希望。

不幸的是,树命令似乎没有正确忽略完整路径模式。

例如,这是一个简单的目录结构:

.
|-A
|-|-a.jpg
|-b.jpg

在这里,我可以像这样排除 A 及其所有文件:

tree -I 'A'

我还可以像这样排除 a.jpg 或 b.jpg :

tree -I 'a.*|b.*'

但我不能像这样排除 a.jpg:

tree -I 'A/a.jpg'

因此,完整路径模式匹配似乎已损坏。

我是否遗漏了一些东西,或者这真的不可能有与 tree 匹配的精细子目录模式吗?

谢谢 !

答案1

我有同样的问题。事实上,我也注意到这$ tree -I 'A/a.jpg'不起作用

但有志者事竟成:

$ tree
.
├── A
│   ├── a.jpg
│   └── b.jpg
└── a.jpg

$ tree --fromfile <<EOF
`tree -f -i -n -F --noreport | grep -v 'A/a.jpg' | grep -v -E '\.$' | sed "s/^\.//"`
EOF
.
├── A
│   └── b.jpg
└── a.jpg

PS:--fromfile选项仅适用于树 1.8 及更高版本

答案2

这行得通吗?

[user2@server-01 ~]$ tree myDir/
myDir/
├── A
│   └── a.jpg
├── B
│   └── a.jpg
└── b.jpg

2 directories, 3 files

如果要获取myDir中所有文件的列表,所有子目录中的文件具有相同的名称;最快的方法是 grep -v?

使用 find 命令、管道和 grep -v 获取要排除的文件的完整路径。

[user2@server-01 ~]$ find myDir/ | grep -v "myDir/A/a.jpg"
myDir/
myDir/A
myDir/b.jpg
myDir/B
myDir/B/a.jpg

或者用你的树方法。但添加 -f 标志以输出完整目录列表。

[user2@server-01 ~]$ tree -f myDir/ | grep -v "myDir/A/a.jpg"
myDir
├── myDir/A
├── myDir/B
│   └── myDir/B/a.jpg
└── myDir/b.jpg

grep -E 可以接受多个参数,用管道符分隔。并且可以与 -v 标志结合使用。

[user2@server-01 ~]$ tree -f myDir/ | grep -vE "myDir/A/a.jpg | myDir/B/a.jpg"
myDir
├── myDir/A
├── myDir/B
└── myDir/b.jpg

2 directories, 3 files

相关内容