如何使树只输出文件?

如何使树只输出文件?

tree有一个-d选项为“ List directories only.。但是,我似乎找不到“仅列出文件”的选项。我浏览了手册页,但似乎找不到仅列出文件的选项。

答案1

正如其他人在评论中所说,仅列出非目录并不完全符合命令的目的tree

但是,仅列出文件在当前目录下如果您像我一样并且更喜欢使用自定义的treeover ls(也许您甚至ls使用tree您喜欢的标志和参数别名),那么这并不罕见。

tree利用和的组合grep将得到你想要的:

$ tree -F
.
├── file1.txt
├── file5.txt
├── parent_dir1/
│   ├── child_dir/
│   ├── file2.txt
│   └── file3.txt
└── parent_dir2/
    └── child_dir2/
        └── file4.txt

4 directories, 4 files
$ tree -FL 1 | grep -v /$
.
├── file1.txt
├── file5.txt

2 directories, 1 file

“F”标志导致tree将“/”附加到目录,而“v”标志则反转grep给定的模式,该模式匹配所有以“/”结尾的行。

您会注意到,尽管目录实际上并未显示,但即​​使最后的摘要仍然适用。

一旦向下超过一级,树结构就会占主导地位,事情会变得有点奇怪。

$ tree -FL 3 | grep -v /$
.
├── file1.txt
├── file5.txt
│   ├── file2.txt
│   └── file3.txt
        └── file4.txt

4 directories, 4 files

编辑

另外,如果这种损坏的树输出让您烦恼(即某些文件以“├─”字符而不是“└─”字符开头,并且多级版本似乎逐渐消失...... ),您可以通过首先对输出目录进行排序来解决此问题。

$ tree --dirsfirst -FL 1 | grep -v /$
.
├── file1.txt
└── file5.txt

2 directories, 1 file
$ tree --dirsfirst -FL 3 | grep -v /$
.
│   ├── file2.txt
│   └── file3.txt
│       └── file4.txt
├── file1.txt
└── file5.txt
4 directories, 5 files

我认为这实际上也使无节点树结构更具可读性。

答案2

考虑以下命令:

tree -ifF /usr/java/default/jre/lib/images | grep -v '/$'

/usr/java/default/jre/lib/images
/usr/java/default/jre/lib/images/cursors/cursors.properties
/usr/java/default/jre/lib/images/cursors/invalid32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_CopyDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_CopyNoDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_LinkDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_LinkNoDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_MoveDrop32x32.gif
/usr/java/default/jre/lib/images/cursors/motif_MoveNoDrop32x32.gif
/usr/java/default/jre/lib/images/icons/sun-java_HighContrastInverse.png
/usr/java/default/jre/lib/images/icons/sun-java_HighContrast.png
/usr/java/default/jre/lib/images/icons/sun-java_LowContrast.png
/usr/java/default/jre/lib/images/icons/sun-java.png

2 directories, 12 files

-i和参数-f导致tree在每行上输出完整路径,而不是缩进。该-F参数导致它将 an 附加/到目录名称中,目录名称将被倒置的 grep ( grep -v '/$') 过滤掉。

我经常使用它的一个变体来帮助我在运行其他命令时不耐烦地观察输出目录(及其子目录)的内容以了解活动...

watch exec "tree -ifFsD /var/local/myapp/data | grep -v '/$'"

答案3

如果您同意不使用的答案tree,我建议您使用find

find $DIR -type f

$DIR您要搜索的目录在哪里。

那么你可以将其美化为树格式如果你愿意的话。

您可以创建一个函数tree_file来完成这一切。功劳归于 JavaSherrif 于这个答案(之前链接)的sed东西。我只是对其进行了调整以包含 UTF 字符。

tree_file() {
    DIR=${1:-"."}

    find $DIR -type f |  sed -e "s/[^-][^\/]*\//  │/g" -e "s/│\([^ ]\)/│── \1/" 
}

答案4

旧线程,但作为 -F now(?) 附加不同的字符来显示文件类型:

-F/' for directories, a为套接字文件附加一个 =',*' for executable files, a为门(Solaris)附加一个 >' 和一个“|”对于 FIFO,按照 ls -F

该命令可能会变成:

watch exec "tree -ifFsD /var/local/myapp/data | grep '[[:alnum:]]$\|\*'"

相关内容