App-dufolder
view release on metacpan or search on metacpan
#!/usr/bin/perl
# use 5.030 ;
use strict ;
use warnings ;
use feature qw [ say state ] ;
use Cwd ;
use File::Spec ;
use Getopt::Std ; getopts '.,:b:i:l:B:G:' , \my %o ;
use List::Util qw[ max sum0 ] ;
use POSIX qw [ strftime ] ;
use Term::ANSIColor qw[ :constants ] ; $Term::ANSIColor::AUTORESET = 1 ;
binmode STDOUT , ':utf8' ;
$o{b} //= 512 ; # stat颿°ã§1åã®ãã¡ã¤ã«ã®ãããã¯æ°ãå¾ãå ´åã«ããããä½åãããããã£ã¹ã¯ãå æãããã¤ãæ°ã«ãªããã
my $optI0 = 0 eq ($o{i} // '' ) ; # -i0ã®æå®ããããå¦ãã inodeã§ä¸è´ãããã®ã¯1åããåãä»ããªãããã«ããã
my $optL0 = 0 eq ($o{l} // '' ) ; # -l0ã®æå®ããããå¦ããstat 颿°ã使ãã lstat 颿°ã使ãããæå®ã
my $optc0 = 0 eq ($o{','}//'' ) ; # -,0ã®æå®ããããå¦ããå鲿³åºåãã§,ã使ããå¦ããæå®ã
$ARGV[0] = '.' if @ARGV == 0 ;
# ç¹æ®ãªé¢æ°
sub d3 ($) ; # æ°ã3æ¡åºåãã«å¤æãããã¨ãã§ããããã«ããã# -,0ãæå®ãããã3æ¡åºåãã«ããªãã
* d3 = $optc0 ? sub ( $ ) { $_[0] } : sub ( $ ) { $_[0] =~ s/(?<=\d)(?=(\d\d\d)+($|\D))/,/gr } ;
sub xstat ( $ ) ; #{ lstat $_ } ;
* xstat = $optL0 ? sub ( $ ) { stat $_ } : sub ( $ ) { lstat $_ } ; # if $optL0 ;
# ã¡ã¤ã³ã¨ãªãé¨å
my $datetime = strftime ( '%Y-%m-%d(%a) %H:%M:%S %Z(%z)', localtime () ) ;
my @files ; # æ¢ç´¢ãããã¡ã¤ã«ãåç´ããã
my @visible ; # éããããã¡ã¤ã«ã®å
¨ä½ã
my $d0 = cwd ;
& getFiles ( $_ , \@files , \@visible ) for @ARGV ;
if ( exists $o{B} ) { & fileDimTable ( $o{'.'} ? @files : @visible ) ; exit }
& prepCommands ( \@files , \@visible , $datetime, my $msg , my $change , my $cmd1 , my $cmd2 ) ; # change ã¯ãã¡ã¤ã«ã®å¤æ´åæ°,
do { say $msg ; exit } unless exists $o{G} ; # -Gã®æå®ãããã°ããã«ç¶ãã
if ( $o{G} =~ /0/ ) { say "$cmd1\n$cmd2" } ; # -Gã«0ãããã°ãã³ãã³ãæã表示
if ( $o{G} =~ /1/ ) { & againCheck ( $change ) and exit } ; # -G ã«1ãããã°ããããåã®ã³ãããã§ãã®ã³ãã³ãã§ã³ãããæ¸ã¿ãªãçµäºã
if ( $o{G} =~ /[12]/ ) { do { my $out2 = qx[$cmd2] ; binmode STDOUT , ':raw' ; say "-- ->", BOLD $out2 //'' } } ; # ã³ãããå®è¡!
exit ;
# ä¸è¨ãæ§é åããããã«åãåºãã颿°
sub getFiles ( $ $$ ) {
state $inodes ;
state $c2 = do { File::Spec -> catfile ( '' , '.' ) } ; # ãã£ã¬ã¯ããªé層ã®åºåãã®ç´å¾ã«ãããããããã¿ã¼ã³ "/."
my @found = split /\n/ , qx [ find $_[0] ] , 0 ; # find ã³ãã³ãã§è¦ã¤ãããã¡ã¤ã«ãæ ¼ç´ã
@found = grep { ! $inodes -> { ( xstat $_ ) [ 1 ] } ++ } @found if ! $optI0 ; # inodeã§éå»ã«ä¸è´ãããã®ã¯é¤å»ãã
push @{ $_[1] } , @found ;
push @{ $_[2] } , grep { ! m/\Q$c2\E/ } @found ;
}
sub prepCommands ( $$$ $$$$ ) {
sub sumdu ( @ ) { sum0 map { my @s = xstat $_ ; max ( $s[7] , $o{b} * $s[12] ) } @_ } # <-- Unixã³ãã³ãduã¨åãäºãããã¤ããã
my ($b1,$b2) = map { sumdu ( @{ $_ [ $_ ] } ) } 0 , 1 ; # ãã¤ãåä½ã®æ°å¤ãªã®ã§bã夿°åã«ç¨ããã
my ($l1,$l2) = map { scalar @{ $_ [ $_ ] } } 0 , 1 ; # é
åã®é·ã l
$_[3] = sprintf "du: %s / %s = %0.3f", d3 $b1, d3 $b2 , $b1 / $b2 ;
$_[3] .= sprintf " obj: %s / %s = %0.2f -- %s", d3 $l1 , d3 $l2 , $l1 / $l2 , $_[2] ;
$_[5] = qq[ git status > /dev/null 2>&1 && git diff --raw HEAD~..HEAD | wc -l # -- -> ] ;
$_[4] = (`$_[5]` =~ s/\n$//sr) ;
$_[5] .= BOLD $_[4] ;# ä½åã®ãã¡ã¤ã«ã HEADã¨ãã®åã®éã§å¤æ´ããã£ããã
$_[6] = qq[ git commit --allow-empty -m '$_[3]' ] ; # --amend
}
sub againCheck ( $ ) {
if ( $_[0] eq 0 ) { # ããã«ç¢ºãããé«ããããã«ãè¨2åã®æ¡ä»¶ã§èª¿ã¹ãã
my $p1 = qr | .* [0-9] .*/.* [0-9] .*=.* [0-9] .* |x ; # <-- å°ãéãªæ¡ä»¶ããããããããã¡ãã¨æ¸ãã¨ããã°ã®å
ã«ãªããããã
my $pattern = qr| du: $p1 obj: $p1 -- .*\d{4}-\d{2}-\d{2} .* \d{2}:\d{2}:\d{2} |x ; #
return 1 if qx [ git log -n1 --oneline ] =~ m/$pattern/s ;
} ;
}
sub fileDimTable ( @ ) { # -B8 ã§èµ·å
say join "\t" , qw[ dir? occ. Size bsize Blocks S/B(1) S/B(2) inode filename ] ;
do { my @s = stat $_ ; say join "\t" , -d $_ ? "D":"" , $s[12]*$o{b}, @s[7,11,12], & pratio ( @s[7,12] ) , $s[1], $_ } for @_ ;
sub pratio ($$) {
my $o1 = $_[1] == 0 ? $_[0] == 0 ? "'0/0'" : '-' : sprintf '%1.2f' , $_[0] / $_[1] ;
my $o2 = $_[1] <= $o{B} ? 0 < $_[1] ? '+infty' : '-' : sprintf '%1.2f' , $_[0] / ( $_[1] - $o{B} ) ;
return ( $o1, $o2 ) ;# ã â $o{B} ã¤ã¾ã-Bã§ä¸ããæ°ãé£ããç¶æ³ãããããã
}
}
# 2022-03-01 thu ; Toshiyuki Shimono ä¸éå¯¿ä¹ (çµ±è¨æ°çç ç©¶æ ç¹ä»»ç ç©¶å¡)
## ãã«ãã®æ±ã
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 ;
}
( run in 1.043 second using v1.01-cache-2.11-cpan-39bf76dae61 )