App-Bin4TSV
view release on metacpan or search on metacpan
scripts/depthdepth view on Meta::CPAN
#!/usr/bin/perl
use 5.014 ; use strict ; use warnings ;
use feature qw [ say ] ;
use Time::HiRes qw[gettimeofday tv_interval] ;
use Term::ANSIColor qw [ :constants color ] ; $Term::ANSIColor::AUTORESET = 1 ;
use File::Spec::Functions qw[ catfile splitdir rel2abs updir ] ;
use Getopt::Std ;
use List::Util qw [ max min sum sum0 reduce ] ;
use Cwd qw [ getcwd abs_path ] ;
my $time_start = [ gettimeofday ] ;
getopts '.:g:x:0:' , \my%o ;
push @ARGV , $o{x} if defined $o{x} ; # 弿°ããªãã·ã§ã³ã§ ä¸ããããå ´åã®å¦ç
my $start_dir = $ARGV [0] // "." ; # å
é ã®ãã£ã¬ã¯ããª
my $I = catfile q[] , q[] ;
my $d0 = ( getcwd ) . $I ;
chdir $start_dir or do { say STDERR "Seems no such a directory ``$start_dir''" ; exit -1 } ;
$d0 = (getcwd ). $I unless exists $o{g} && $o{g} =~ m/a/ ;
$d0 = '' if exists $o{g} && $o{g} =~ m/A/ ;
#say GREEN getcwd ;
sub head_trim ( $ ) {
(my $t = $_[0]) =~ s/^\Q$d0\E// ;
$t =~ s/\ /\\ /g ; # <-- ç©ºç½æåãã¨ã¹ã±ã¼ã xargs ã«æ¸¡ããããã«ãªãã
$t ;
}
& main ;
exit 0 ;
END{ print RESET "" } ;
sub open_dir_error_message ( $ ) {
say STDERR FAINT BOLD YELLOW "Cannot open the directory `$_[0]' so skipped." ;
}
# ãã®ã¤ã³ã¹ã¿ã³ã¹ã®ä¸ã®ãã£ã¬ã¯ããªãã¡ã¤ã«ã®ä¸è¦§ãæååã®é
åã§è¿ãã
sub get_dirs () {
my @dirs ;
#return @dirs = grep { -d $_ } glob '*' ;
opendir my $dh , '.' or do { open_dir_error_message ( abs_path "." ) ; return () } ;
@dirs = grep { ! /\A\.{1,2}\Z/ && -d $_ } readdir $dh ;
@dirs = grep { ! /\A\./ } @dirs if exists $o{'.'} && $o{'.'} eq "0" ; # é ããã¡ã¤ã«ã«é¢ããå¦ç
closedir $dh ;
return @dirs ;
}
sub main () {
# ã³ã³ãåºåã ãã¤ãã³çµåãã¢ã®åãåºã
my @gg = do { ! exists $o{g} ? () : (my $t = $o{g}) =~ s/[Aadlx]//g ; map { [ split /-/, $_ ] } split /,/ , $t // '' } ;
our %g1 = map { $_ ->[0] , 1 } grep { @ { $_ } == 1 } @gg ; # ãã¢ã§ã¯ãªããã®
our %g2 = map { $_->[0] ."-" .$_->[1] , 1 } grep { @ { $_ } == 2 } @gg ; # ãã¢ã®ãã®
our @S ; #ã$S[depth][maxdepth]ã®éè¨è¡¨ã¨ãªãã
our @Sq ; # $S_ln [ depth ]
$SIG{INT} = sub { say GREEN getcwd ; & output } ;
& node_proc ( 0 ) ;
& output () unless exists $o{g} && $o{g} =~ m/x/ ;
sub node_proc ( $ ) {
# 第ï¼å¼æ°ã¯ãå
ã®æå®ãã£ã¬ã¯ããªããã®æ·±ãã§ããã
# è¿ãå¤ã¯ãããã§çµé¨ããæå¤§ã®æ·±ãã§ããã
my $dep = $_[0] ; # æ·±ã
my $mdep = $dep ; # æå¤§æ·±ãã®è¨é²ç¨ã
my @dirs ; # = get_dirs () ;
opendir my $dh , '.' or do { open_dir_error_message ( abs_path "." ) ; return () } ;
#@dirs = sort grep { ! /\A\.{1,2}\Z/ && -d $_ && ! -l $_ } readdir $dh ; # <-- - sort 㯠-g ãç¡ãã¨ãã¯ä¸è¦ã§ãã
my @dirs0 = sort grep { ! /\A\.{1,2}\Z/ && -d $_ } readdir $dh ; # <-- - sort 㯠-g ãç¡ãã¨ãã¯ä¸è¦ã§ãã
for ( @dirs0 ) { #reverse 0 .. $#dirs ) {
if ( -l $_ )
{
say join "\t" , $o{g} =~ m/d/ ? () : "link", head_trim (getcwd).$I.$_ if exists $o{g} && $o{g} =~ m/l/;
#splice @dirs , $_ , 1 ;
++ $Sq [ $dep + 1 ] ;
next ;
}
push @dirs , $_ ;
}
#@dirs = grep { ! ( -l $_ && ++ $Sq[$dep+1] ) } @dirs ;
#@dirs = grep { ! ( -l $_ ) } @dirs ;
@dirs = grep { ! /\A\./ } @dirs if exists $o{'.'} && $o{'.'} eq "0" ; # é ããã¡ã¤ã«ã«é¢ããå¦ç
#closedir $dh ;
for ( @dirs ) {
#chdir $dh ;
next unless chdir $_ ;
#chdir $_ ;
$mdep = max $mdep , & node_proc ( $dep + 1 ) ; # <-- å帰çãªå¼ã³åºã
chdir $dh or die ; # ããã§æ»ããªãã®ã¯é大
}
closedir $dh ;
$S [ $dep ] [ $mdep ] ++ ;
say join "\t" , $o{g} =~ m/d/ ? () : $dep, head_trim getcwd if $g1{$dep} ;
say join "\t" , $o{g} =~ m/d/ ? () : "$dep-$mdep", head_trim getcwd if $g2{"$dep-$mdep"} ;
return $mdep ;
}
sub output () {
my $asum = 0 ; # ãã¡ã¤ã«æ°ã®åè¨
my @out = ( '', 0 .. $#S , '+' , '++' ) ;
push @out , MAGENTA "Symbolic_link_dir" if sum0 map { $_ // 0 } @Sq ;
say join "\t" , @out ;
for ( 0 .. $#S ) {
$S[$_][$_] //= 0 ; # unless exists $o{0} && $o{0} eq "." ; # å¯¾è§æåã«å¯¾ããå¦ç
for my $i ( $_ .. $#S ) { $S[$_][$i] //= '' } ;
my @out = ( $_ , map { ! defined $_ ? '' : $_ eq '' ? FAINT 0 : $_ } @{$S[$_]} ) ;
push @out , FAINT my $rsum = sum0 map { $_ || 0 } @{$S[$_]} ;
push @out , $asum += $rsum ;
push @out , MAGENTA "+$Sq[ $_ ]" if $Sq [$_] ;
say join "\t" , @out ;
}
}
END{
say STDERR " -- " , REVERSE ITALIC " Process time: " , CLEAR " " ,
sprintf( "%.6f", tv_interval $time_start , [ gettimeofday ] ) , " second(s)." ;
}
}
## ãã«ãã®æ±ã
sub VERSION_MESSAGE {}
sub HELP_MESSAGE {
use FindBin qw[ $Script ] ;
$ARGV[1] //= '' ;
open my $FH , '<' , $0 ;
while(<$FH>){
s/\$0/$Script/g ;
print $_ if s/^=head1// .. s/^=cut// and $ARGV[1] =~ /^o(p(t(i(o(ns?)?)?)?)?)?$/i ? m/^\s+\-/ : 1;
}
close $FH ;
exit 0 ;
}
=encoding utf8
=head1
ã$0 [dirname]
æå®ããããã£ã¬ã¯ããªãããié層ä¸ã«æ½ã£ãã¨ããã«ã
jé層ä¸ã¾ã§ãã£ã¬ã¯ããªãæã¤ãã£ã¬ã¯ããªãä½åããã®ãã示ãã
縦æ¹åãiã§ã横æ¹åãjã«å¯¾å¿ããã
+ã¨è¡¨è¨ãããåã¯ãié層ã®åè¨å¤ã示ãã++ã¯ç´¯ç©åã
ã·ã³ããªãã¯ãªã³ã¯ã®ãã£ã¬ã¯ããªã¯è¾¿ããªããåå¨ããå ´åã¯ããã®æ°ãåºåããã
ãªãã·ã§ã³:
-x dirname : 弿°dirnameã¨ãã¦ä¸ãããã£ã¬ã¯ããªåããªãã·ã§ã³ã¨ãã¦æ¸¡ãã
-. 0 : é ããã¡ã¤ã«ã辿ããªãã
-g N1-N2 ; iãN1, jãN2ã«ç¸å½ãããã£ã¬ã¯ããªåãåºåãããN1-N2ã®æ¸å¼ã¯ ã³ã³ã(,)ã§é£çµãå¯è½
-g ...[dx] ; xãæå®æååã«å«ããã¨ã§è¡¨ã®åºåãæå¶ãããdãããå ´åã¯æ·±ãæ
å ±ã¯æå¶ããã
-g ...[Aa] : aã®æç¡ã§ãã£ã¬ã¯ããªã®è¡¨ç¤ºãå¤ãããããã°ãæå®ãã£ã¬ã¯ããªåãã表示ãããAãå«ãã°ã絶対ãã¹ã¨ãªãã
-g ...l : ã·ã³ããªãã¯ãªã³ã¯ã®ãã£ã¬ã¯ããªãåºåããã
ãã®ä»ã®æ³¨æ:
- Ctrl+C ã§ã¯éä¸çµæãåºãã®ã¿ã§ï¼åæ¢ããªããCtrl+\ã§åæ¢ããã
éçºä¸ã®æ³¨æ :
* chdir ".." ãæå³éãã«åä½ããªããã¨ããã£ãã®ã§ãopendirã使ã£ãåä½ã¨ããã
( run in 0.562 second using v1.01-cache-2.11-cpan-5511b514fd6 )