11

这个问题是ZipArchive() 输出树格式问题的通用版本。


在我浪费时间编写这个(*nix 命令行)实用程序之前,最好先看看是否有人已经编写了它。我想要一个实用程序,它将获得一个列表作为其标准输入,例如返回的列表,find(1)并输出类似于 bytree(1)

例如:

输入:

/fruit/apple/green
/fruit/apple/red
/fruit/apple/yellow
/fruit/banana/green
/fruit/banana/yellow
/fruit/orange/green
/fruit/orange/orange
/i_want_my_mommy
/person/men/bob
/person/men/david
/person/women/eve

输出

/
|-- fruit/
|   |-- apple/
|   |   |-- green
|   |   |-- red
|   |   `-- yellow
|   |-- banana/
|   |   |-- green
|   |   `-- yellow
|   `-- orange/
|       |-- green
|       `-- orange
|-- i_want_my_mommy
`-- person/
    |-- men/
    |   |-- bob
    |   `-- david
    `-- women/
        `-- eve

用法应该是这样的:

list2tree --delimiter="/" < Input > Output

Edit0:似乎我不清楚这个练习的目的。我喜欢树的输出,但我希望它用于任意输入。它可能不是任何文件系统名称空间的一部分。

Edit1:person输出上的固定分支。谢谢,@Alnitak。

4

5 回答 5

8

在我的 Debian 10 中,我有tree v1.8.0. 它支持--fromfile.

--fromfile
从文件而不是文件系统中读取目录列表。命令行上提供的路径是要读取的文件,而不是要搜索的目录。点 ( .) 目录表示tree应该从标准输入读取路径。

通过这种方式,我可以提供以下tree输出find

find /foo | tree -d --fromfile .

问题:

  • 如果tree读取/foo/whateverfoo/whatever然后foo将报告为的子目录。与:.类似,将报告为在顶层下命名的附加级别。所以结果可能并不完全符合你的正式期望,总会有一个顶级条目。即使什么也没找到或抛出错误,它也会在那里。./whatever....find

  • 带有换行符的文件名会混淆tree. 使用find -print0不是一个选项,因为没有对应的开关tree

于 2020-05-19T13:13:48.453 回答
5

我编写了一个分割路径(在“/”上)的 Perl 脚本,创建一个哈希树,然后使用 Data::TreeDumper 打印该树。有点hacky,但它有效:

#!/usr/bin/perl
use strict;
use warnings;

use Data::TreeDumper;

my %tree;
while (<>) {
    my $t = \%tree;
    foreach my $part (split m!/!, $_) {
        next if $part eq '';
        chomp $part;
        $t->{$part} ||= {};
        $t = $t->{$part};
    }
}
sub check_tree {
    my $t = shift;
    foreach my $hash (values %$t) {
        undef $hash unless keys %$hash;
        check_tree($hash);
    }    
}
check_tree(\%tree);
my $output = DumpTree(\%tree);
$output =~ s/ = undef.*//g;
$output =~ s/ \[H\d+\].*//g;
print $output;

这是输出:

$ perl test.pl test.data

|- 水果
| |- 苹果
| | |- 绿色
| | |- 红色
| | `- 黄色
| |- 香蕉
| | |- 绿色
| | `- 黄色
| `-橙色
| |- 绿色
| `-橙色
|- i_want_my_mommy
`-人
   |- 男士
   | |- 鲍勃
   | `-大卫
   `- 妇女
      `-前夕
于 2012-07-18T19:28:12.997 回答
1

所以,我终于写了我希望成为python 树 utils的东西。在http://pytree.org上找到它

于 2013-03-13T18:54:35.663 回答
1

另一个工具是用Rust编写的treeify

假设您安装了 Rust,请使用:

$ cargo install treeify
于 2019-01-21T14:11:48.173 回答
0

我会简单地使用tree自己,但这是我几天前写的一个简单的东西,它打印了一个目录树。它不期望来自 find 的输入(这与您的要求不同)并且不进行|-显示(可以通过一些小的修改来完成)。你必须这样称呼它tree <base_path> <initial_indent>intial_indent是第一个“列”缩进的字符数。

function tree() {
    local root=$1
    local indent=$2
    cd $root
    for i in *
    do
    for j in $(seq 0 $indent)
    do 
        echo -n " "
    done
    if [ -d $i ]
    then
        echo "$i/"
        (tree $i $(expr $indent + 5))
    else
        echo $i
    fi
    done
}
于 2010-12-12T09:21:45.637 回答