ディレクトリ構成図ツクール

ls -aFRの結果を加工してこんな感じの図を生成します。スクリプト文字コードEUC。090406追記。文字コードは環境に合わせてくださいませ。会社サーバーだとutf-8で文字化けなくいけました。091225追記。ls -aFR→ls -atFRに変更。更新順でソート。

	├	contrib/
	│	├	README*
	│	└	packaging/
	│		└	Fedora/
	│			├	phpMyAdmin-http.conf*
	│			└	phpMyAdmin.spec*
#!/usr/local/bin/perl
use strict;
my($tab,@DATA,@pre,@now,@DATA_);

if(@ARGV < 1){
	print"usage:$0 [dirname]\n";
	exit;
}

my $path = shift @ARGV;

if(!-d($path)){
	print"error:'$path' is not exist.\n";
	exit;
}

my @data = `ls -atFR $path`;

my $root_dirname = `cd $path;pwd`;
$root_dirname =~s/\r|\n//g;

foreach(@data){
	$_ =~s/\r|\n//g;
	next if $_ eq './' || $_ eq '../';
	my $line = $_;
	if($line =~/^\Q$path\E/){
		$line =~s/^\Q$path\E//g;
		$line =~s/^\///;
		my @datas = split/\//,$line;
		my $num = @datas;
		my $dirname = pop @datas;
		$num = 0 if $dirname eq ':';
		$dirname = "$root_dirname/" if $dirname eq ':';
		$dirname =~s/:$/\//;
		$tab = "│\t" x $num;
		push @DATA,"$tab├\t$dirname\n";
	}else{
		next if $line =~/\/$/ || $line eq '';
		push @DATA,"$tab│\t├\t$line\n";
	}
}

foreach(reverse @DATA){
	$_ =~s/\r|\n//g;
	@now = split"\t",$_;
	foreach my $num (0..$#now){
		if($pre[$num] !~/│|├|└/){
			$now[$num] =~s/│// ;
			$now[$num] =~s/├/└/ ;
		}
	}
	@pre = @now;
	my $buf = join"\t",@now;
	push @DATA_,"$buf\n";
}

print reverse @DATA_;

exit;