конвертировать `find` как вывод в` tree` как вывод - PullRequest
4 голосов
/ 12 декабря 2010

Этот вопрос является обобщенной версией вывода ZipArchive () в древовидном формате вопрос.


Непосредственно перед тем, как я потрачу время на написание этой (* nix командной строкиутилита, это будет хорошая идея, чтобы узнать, если кто-то уже написал это.Мне нужна утилита, которая получит в качестве стандартного ввода список, такой как возвращаемый find(1), и выведет что-то похожее на tree(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 на выходе.Спасибо, @ Альнитак.

Ответы [ 4 ]

4 голосов
/ 18 июля 2012

Я выбрал 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
1 голос
/ 13 марта 2013

Итак, я наконец написал то, что, надеюсь, станет python tree utils .Найдите это в http://pytree.org

0 голосов
/ 21 января 2019

Другой инструмент - treeify , написанный на Rust .

Если у вас установлен Rust, получите:

$ cargo install treeify
0 голосов
/ 12 декабря 2010

Я бы просто использовал 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
}
...