#!/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 uniq ] ; use Cwd qw [ getcwd abs_path ] ; use POSIX qw[ strftime ] ; my $time_start = [ gettimeofday ] ; getopts '~.:b:dHMmrSv:x:y' , \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/ ; & main ; exit 0 ; END{ print RESET "" } ; sub main () { our $fmt = $o{y} ? "%Y" : $o{m} ? "%Y-%m" : $o{d} ? "%Y-%m-%d" : $o{H} ? "%Y-%m-%dT%H" : $o{M} ? "%Y-%m-%dT%H:%M" : $o{S} ? "%Y-%m-%dT%H:%M:%S" : "%Y-%m-%d" ; & node_proc ( 0 ) ; & output () ; sub open_dir_error_message ( $ ) { say STDERR FAINT BOLD YELLOW "Cannot open the directory `$_[0]' so skipped." ; } sub node_proc ( $ ) { # 第1引数ã¯ã€å…ƒã®æŒ‡å®šãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‹ã‚‰ã®æ·±ã•ã§ã‚り〠# 返り値ã¯ã€ãã“ã§çµŒé¨“ã—ãŸæœ€å¤§ã®æ·±ã•ã§ã‚る。 my $dep = $_[0] ; # 深㕠my $mdep = $dep ; # 最大深ã•ã®è¨˜éŒ²ç”¨ã€‚ our ( %nA , %nM, %nC ) ; #ファイルã®å€‹æ•°ã‚’時間ã®ãƒ“ン毎ã«è¨˜éŒ²ã™ã‚‹ our ( %bA , %bM, %bC ) ; #ファイルã®ãƒã‚¤ãƒˆæ•°ã®åˆè¨ˆã‚’時間ã®ãƒ“ン毎ã«è¨˜éŒ²ã™ã‚‹ opendir my $dh , '.' or do { open_dir_error_message ( abs_path "." ) ; return () } ; my @nondir ; # plain files ; my @dirs0 = readdir $dh ; @dirs0 = grep { ! /\A\./ } @dirs0 if exists $o{'.'} && $o{'.'} eq "0" ; # éš ã—ファイルã«é–¢ã™ã‚‹å‡¦ç† @dirs0 = grep { ! /\A\.{1,2}\Z/ && ( -d $_ || do{ push @nondir , $_ ; 0 } ) } @dirs0 ; my @dirs = grep { ! -l $_ } @dirs0 ; for ( @nondir ) { my @ti = ( stat ) [ 7 .. 10] ; my $byte = shift @ti ; @ti = map { strftime $fmt , localtime $_ } @ti ; $nA { $ti[0] } ++ ; $nM { $ti[1] } ++ ; $nC { $ti[2] } ++ ; $bA { $ti[0] } += $byte ; $bM { $ti[1] } += $byte ; $bC { $ti[2] } += $byte ; } ## print CYAN "@nondir" ; return unless $o{r} ; # å†å¸°çš„ã«ä¸‹ã«è¾¿ã‚‹ã‹å¦ã‹ã€‚ for ( @dirs ) { next unless chdir $_ ; $mdep = max $mdep , & node_proc ( $dep + 1 ) ; # <-- å†å¸°çš„ãªå‘¼ã³å‡ºã— chdir $dh or die ; # ã“ã“ã§æˆ»ã‚Œãªã„ã®ã¯é‡å¤§ } closedir $dh ; return $mdep ; sub output () { my @t0 = ( "when" , "#accessed" , "#modified" , "#created" ) ; push @t0 , "byteSum_A" , "byteSum_M" , "byteSum_C" unless exists $o{b} && $o{b} eq "0" ; say join "\t" , @t0 ; my @k = uniq sort keys %nA , keys %nM, keys %nC ; @k = reverse @k if $o{'~'} ; for ( @k ) { my @t = ( $_ , $nA{$_} , $nM{$_} , $nC{$_} ) ; push @t , $bA{$_} , $bM{$_} , $bC{$_} unless exists $o{b} && $o{b} eq "0" ; say join "\t" , map {$_ //'' } @t ; } } } END{ exit if exists $o{v} && $o{v} eq "0" ; 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 ; $o{v} = 0 ; exit 0 ; } =encoding utf8 =head1  $0 [dirname] オプション: -y : å¹´å˜ä½ã§é›†è¨ˆ -m : 月å˜ä½ã§é›†è¨ˆ -d : æ—¥å˜ä½ã§é›†è¨ˆ (åˆæœŸè¨å®š) -H : 時å˜ä½ã§é›†è¨ˆ -M : 分å˜ä½ã§é›†è¨ˆ -S : ç§’å˜ä½ã§é›†è¨ˆ -. 0 : éš ã—ファイルを処ç†å¯¾è±¡ã¨ã—ãªã„ã“ã¨ã®æŒ‡å®š -b 0 : ãƒã‚¤ãƒˆæ•°ã®åˆè¨ˆã®å‡ºåŠ›ã®æŠ‘åˆ¶ã®æŒ‡å®š -r : ディレクトリをå†å¸°çš„ã«ä¸‹ã«è¾¿ã‚‹ã€‚ -~ : å‡ºåŠ›ã®æ™‚é–“é †ã‚’é€†ã«ã™ã‚‹ã€‚ -v 0 : 処ç†ã«è¦ã—ãŸç§’æ•°ã®æƒ…å ±ã®æŠ‘åˆ¶ã®æŒ‡å®š