2010-12-12 58 views
4

这个问题是Output of ZipArchive() in tree format问题的一般化版本。像输出一样将`find`类似输出转换为`tree`


我在写这篇(* nix的命令行)工具浪费时间就在,这将是一个好主意,找出是否有人已经写的。我想一个实用工具,将获得作为其标准输入列表如tree(1)

例如,由find(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:看来我是不太清楚这个练习的目的。我喜欢树的输出,但我希望它可以用于任意输入。它可能不是任何文件系统名称空间的一部分。

编辑1:固定person分支在输出。谢谢,@Alnitak。

+0

找到它输出将是不可靠的,除非你安排输入文件的目录后有'/'。否则,过滤器将无法区分空目录和文件。附:你搞乱了树的“人”分支...... – Alnitak 2010-12-12 08:54:30

+0

“树”(例如'树-F')有什么问题? – 2010-12-12 09:02:28

+0

澄清@ ring0的优秀评论:http://mama.indstate.edu/users/ice/tree/ – nc3b 2010-12-12 09:04:41

回答

3

我掀起一个Perl脚本,分割路径(在“/”),创建一个哈希树,然后用Data :: TreeDumper打印树。有点哈克,但它的工作原理:

#!/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 

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

我自己简单地使用tree,但这里有一个简单的事情,我前几天写了一个打印目录树的简单的东西。它不期望从查找中输入(这与您的要求不同),并且不会执行显示(可以通过一些小修改来完成)。你必须像这样称呼它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 
} 
+0

对不起,我不清楚。请参阅问题中的“编辑:”。我不是在寻找树实用程序本身。 'find'和'tree'只是为了说明输入和输出的形式,而不是它的内容。 – 2010-12-12 09:31:26

1

所以,我终于写了什么,我希望这将成为蟒蛇树utils的。在http://pytree.org