App-Bin4TSV
view release on metacpan or search on metacpan
scripts/samesize 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 uniq ] ;
use Cwd qw [ getcwd abs_path ] ;
use POSIX qw[ strftime ] ;
#use Digest::SHA1 qw[ sha1 sha1_hex sha1_base64 ];
use Digest::MD5 qw(md5 md5_hex md5_base64);
sub dtwhen ( $ ) ;
my $time_start = [ gettimeofday ] ;
my $t0 = $time_start -> [0] ;
#say dtwhen ( $t0 ) ;
getopts '0:2b:Df:nos' , \my%o ;
my @files = @ARGV ? @ARGV : glob '*' ;
$o{2} = 1 if $o{D} ; # <--- è¦æ³¨æã ä¸ç¨æã®ãã®è¡ã¯ã³ã¡ã³ãã¢ã¦ããé¤å»ãããªãããã«ã
$o{0} //= 1 ; # <--- è¦æ³¨æã ä¸ç¨æã®ãã®è¡ã¯ã³ã¡ã³ãã¢ã¦ããé¤å»ãããªãããã«ã
& main ;
exit 0 ;
END{ print RESET "" } ;
sub main () {
my %s2f ;
for ( @files ) {
next if -d $_ ;
my $size = ( lstat $_ ) [7] ; # <-- -- lstat ã§è¯ãã®ã
next if defined $o{b} && $size < $o{b} ;
push @{$s2f{$size}} , $_ ;
my @out = ( $size , $_ ) ;
#say join "\t" , @out ;
}
my $least = $o{f} // 2 ; # ? 1 : 2 ;
my @sizes = sort {$a<=>$b} grep { @{ $s2f { $_ } } >= $least } keys %s2f ;
my $nfmt = do { my $t = max @sizes , 0 ; my $d = length "$t" ; "%${d}s" } ; # <-- %${d}u ??
for my $size ( @sizes ) {
#next if @{ $s2f{$size} } == 1 ;
my @files = sort @{ $s2f{$size} } ; # ãã¡ã¤ã«ã®ä¸è¦§
@files = sort {(stat $a)[9] <=> (stat $b)[9] } @files if $o{n} // $o{o} ;
@files = reverse @files if $o{n} ;
my %seenD ; # æ¢ã«è¦ãããã·ã¥ãã¤ã¸ã§ã¹ãå¤
for ( @files ) {
my @t3 = (stat $_)[8,9,10] ; # <-- stat ã«ããã®ã便å®ä¸ã®å¤æ´
my $ctx = Digest::MD5->new;
unless ($o{0}){
open my $FH, '<', $_ or die "Can't open '$_': $!";
binmode $FH ;
$ctx->addfile( $FH );
#while ( <$FH> ) { $ctx -> add ( $_ ) }
close $FH ;
}
utime @t3[0,1] , $_ unless $o{0} ; # <- -- --- æå»æ
å ±ãç ´å£ããã®ã§æ³¨æããããã¯ç§ã®å°æ°ç¹ä»¥ä¸ã®æ
å ±ãæ¶ããã
my $digest = $o{0} ? '---' : $ctx->hexdigest ;
next if $o{2} && ! $seenD{ $digest } ++ ;
if ( $o{D} && ! $o{0} ) { unlink $_ ; next } ;
my @out = ( sprintf ($nfmt , $size) , $digest , map ( dtwhen $_ , @t3 ) , $_ ) ;
say join "\t" , @out ;
}
}
}
sub dtwhen ( $ ) {
my $fmt = abs ( $_[0] - $t0 ) >= 86400 * 180 ? '%Y-%m-%d' : $o{s} ? '%m-%d %H:%M:%S' : '%m-%d %H:%M';
strftime $fmt , localtime $_[0] ;
}
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 files ..
ãªãã·ã§ã³:
-0 0 : MD5ããã·ã¥å¤ãç®åºããããã¡ã¤ã«ã®ã¢ã¯ã»ã¹æå»ãinodeæå»ãå¤ããå±éºã確èªãã广ãããã
-b N : å¦ç対象ã¨ããæå°ã®ãã¤ããµã¤ãºãæå®ã0ãã¤ããã¡ã¤ã«ãé¿ãããªã1ãæå®ã
-f N : å°ãªãã¨ãä½ååºç¾ãããã®ã ããåãåºããã®æå®ãåæå¤ã¯2ã
-n : åããã¡ã¤ã«ãµã¤ãºãªãæ¸ææ¥æã®æ°ããé (newer)
-o : åããã¡ã¤ã«ãµã¤ãºãªãæ¸ææ¥æã®å¤ãé (older)
-s : 180æ¥ä»¥å
ã«ã¤ãã¦ãæ¥ææ
å ±ã¯ç§åä½ã§è¡¨ç¤ºã
( run in 1.679 second using v1.01-cache-2.11-cpan-0bb4e1dffa6 )