2010-12-12 7 views
4

Diese Frage ist eine verallgemeinerte Version der Output of ZipArchive() in tree format Frage.wandeln Sie einen `find` ähnlichen Ausgang in einen` Baum` wie Ausgang um


Kurz bevor ich Zeit vergeude auf das Schreiben dieses (* nix Kommandozeile) Dienstprogramm, wird es eine gute Idee, um herauszufinden, ob jemand bereits schrieb. Ich würde ein Dienstprogramm wie die als Standardeingabe eine Liste wie die von find(1) und ausgeben wird etwas ähnlich dem von tree(1)

Eg zurück zu bekommen:

Eingang:

/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 

Ausgabe

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

Verbrauch sollte etwas sein wie:

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

Edit0: Es scheint, dass ich nicht klar über den Zweck dieser Übung war. Ich mag die Ausgabe von Baum, aber ich will es für beliebige Eingabe. Es ist möglicherweise nicht Teil eines Dateisystem-Namensbereichs.

Edit1: Fixed person Verzweigung am Ausgang. Danke, @ Alnitak.

+0

Die Ausgabe wird nicht zuverlässig sein, es sei denn, Sie arrangieren, dass die Eingabedatei nachstehende '/' auf Verzeichnisse haben. Ohne diesen kann der Filter den Unterschied zwischen einem leeren Verzeichnis und einer Datei nicht erkennen. p.s. Du hast den 'person'-Zweig des Baumes durcheinander gebracht ... – Alnitak

+0

Was ist los mit' tree' (zB 'tree -F')? –

+0

Um auf @ ring0 ausgezeichneten Kommentar zu klären: http://mama.indstate.edu/users/ice/tree/ – nc3b

Antwort

3

ich ein Perl-Skript aufgepeitscht, die die Pfade (auf „/“) teilt, schafft einen Hash-Baum, und druckt dann den Baum mit Data :: TreeDumper. Kinda hacky, aber es funktioniert:

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

Hier ist der Ausgang:

 
$ 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

Ich würde einfach tree selbst verwenden, aber hier ist eine einfache Sache, die ich vor ein paar Tagen schrieb, die einen Baum eines Verzeichnisses druckt. Es erwartet keine Eingabe von Find (was sich von Ihren Anforderungen unterscheidet) und macht nicht die |- Anzeige (die mit einigen kleinen Änderungen gemacht werden kann). Sie müssen es so nennen tree <base_path> <initial_indent>. intial_indent ist die Anzahl der Zeichen, die die erste "Spalte" eingerückt ist.

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

Sorry, ich war nicht klar. Bitte beachten Sie die "Bearbeiten:" in der Frage. Ich suche nicht das Baumwerkzeug selbst. 'find' und' tree' dienen nur dazu, die Form der Eingabe und Ausgabe zu veranschaulichen, nicht ihren Inhalt. –

1

So schrieb ich endlich, was ich die Python Baum utils wird sich Hoffnung. Finden Sie es unter http://pytree.org