我正在尝试使用 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