2010-12-12 51 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