2010-12-12 2 views
4

이 질문은 Output of ZipArchive() in tree format 질문의 일반화 된 버전입니다. 누군가가 이미 쓴 경우, 나는이 (* nix에서 스크립트 명령 줄) 유틸리티 작성에 시간을 낭비하고 직전`find`와 비슷한 출력을`tree`와 같은 출력으로 변환합니다.


, 찾아 좋은 생각이 될 것입니다.

입력 :

/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 
나는 그런 tree(1)

예에 의해 find(1) 및 출력됩니다 비슷한 무언가에 의해 반환되는 하나의 '표준 입력으로 목록을 얻을 것이다 유틸리티를 싶습니다

출력

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

편집 0 :이 연습의 목적이 명확하지 않은 것으로 보입니다. 나는 나무의 산출물을 좋아하지만 임의적 인 입력을 원한다. 파일 시스템 네임 스페이스의 일부가 아닐 수도 있습니다.

편집 1 : 출력에 person 브랜치가 고정되었습니다. 고마워, 알 니탁.

+0

입력 파일의 디렉토리에'/'이 오도록 정렬하지 않으면 출력이 안정적이지 않습니다. 이 필터가 없으면 필터는 빈 디렉토리와 파일의 차이를 알 수 없습니다. 추신. 당신은 tree의'person' branch를 엉망으로 만들었습니다 ... – Alnitak

+0

'tree'의 문제점은 무엇입니까 (예 :'tree -F')? –

+0

@ ring0의 뛰어난 코멘트를 명확히하기 위해 : http://mama.indstate.edu/users/ice/tree/ – nc3b

답변

3

내가 ("/"에) 경로를 분할하는 Perl 스크립트를 채찍질, 해시 트리를 만든 다음 데이터 :: 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 자신을 사용 하겠지만, 며칠 전 디렉토리의 트리를 인쇄하는 간단한 작업이 있습니다. 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 
} 
+0

죄송합니다. 분명치 않았습니다. 질문의 "편집 :"을 참조하십시오. 나는 나무 그 자체를 찾고 있지 않다. 'find'와'tree'는 단지 입력과 출력의 형식을 설명하기위한 것이지, '내용'은 아닙니다. –

1

, 나는 마침내 내가 파이썬 트리 유틸 될 것입니다 무슨 희망이 썼다. http://pytree.org

관련 문제