nieuwe vlaggetjes

This commit is contained in:
Ward Wouts 2015-08-13 13:24:44 +00:00
parent ad09108fde
commit b9bfa6e1dd

View file

@ -1,8 +1,5 @@
#!/usr/bin/perl -w #!/usr/bin/perl -w
# $Id$
# $Source$
# Generates a list of files in cur. dir which are actually the same # Generates a list of files in cur. dir which are actually the same
# Compares size and MD5 checksum # Compares size and MD5 checksum
# Handy for cleaning up pictures like this: # Handy for cleaning up pictures like this:
@ -20,26 +17,42 @@ use Getopt::Std;
my %opts = (); my %opts = ();
my @dirs; my @dirs;
my @files;
&cmdline; &cmdline;
my @filelist = &getdir; my @filelist = &getdir;
push @filelist, @files;
if ( $opts{m} ) { if ( $opts{m} ) {
&mp3_comp(@filelist); &mp3_comp(@filelist);
} else {
if ( $opts{f} ) {
&get_md5s(@filelist);
} else { } else {
my %sizes = &get_sizes(@filelist); my %sizes = &get_sizes(@filelist);
&quick_comp(%sizes); &quick_comp(%sizes);
} }
}
################################# #################################
# functions # functions
sub cmdline { sub cmdline {
getopts('dehlms', \%opts); getopts('adefhlms', \%opts);
if ( $opts{h} ) { &help; } if ( $opts{h} ) { &help; }
map { if ( -d $_ ) { s/\/$//; push @dirs, $_; } else { die "$_ not a directory" } } @ARGV; map { if ( -d $_ ) {
if ( scalar @dirs == 0 ) { s/\/$//;
push @dirs, $_;
} else {
if ( -f $_ ) {
push @files, $_;
} else {
die "$_ not a directory or file"
}
} } @ARGV;
if ( scalar @dirs == 0 && scalar @files == 0 ) {
push @dirs, "."; push @dirs, ".";
} }
@ -47,7 +60,6 @@ sub cmdline {
print "-l doens't combine with -d, -e or -s\n\n"; print "-l doens't combine with -d, -e or -s\n\n";
&help; &help;
} }
# map { print "$_\n"; } @dirs;
} }
sub getdir { sub getdir {
@ -75,6 +87,14 @@ sub get_sizes(@) {
return %sizes; return %sizes;
} }
sub get_md5s(@) {
my %md5s;
foreach (@_) {
push @{$md5s{&calc_md5($_)}}, $_;
}
&output_doubles(%md5s);
}
sub quick_comp(%) { sub quick_comp(%) {
my %sizes = @_; my %sizes = @_;
my ( $size, %md5s ); my ( $size, %md5s );
@ -93,15 +113,34 @@ sub quick_comp(%) {
# same md5 calculation i use in mv_wrap # same md5 calculation i use in mv_wrap
sub calc_md5($) { sub calc_md5($) {
my $file = shift; my $file = shift;
my ( $digest, $md5, $FILE ); my ( $digest, $fh, $off, $startoff );
my $buf = 4096*1024;
my $md5 = Digest::MD5->new;
$md5 = Digest::MD5->new; $md5 = Digest::MD5->new;
open $FILE, "<$file" or die "couldn't open file: $!\n"; open($fh, "<$file") or die "Couldn't open file: $!\n";
seek($FILE, 0, 0); binmode($fh);
$md5->reset; seek $fh, 0, 2; # go to end of file
$md5->addfile($FILE); my $eof = tell $fh;
$digest = $md5->hexdigest;
close($FILE); seek($fh, 0, 0);
return $digest; if ( $opts{f} ) {
readline($fh);
$off = tell $fh;
} else {
$off = 0;
}
while ($off < $eof) {
seek $fh, $off, 0;
if ($buf > ($eof - $off)) { $buf = $eof - $off; }
read $fh, my($bytes), $buf;
$md5->add($bytes);
$off += $buf;
}
close $fh;
return $md5->hexdigest;
} }
sub mp3_comp(@) { sub mp3_comp(@) {
@ -171,12 +210,18 @@ sub has_v2_tag {
sub output_doubles(@) { sub output_doubles(@) {
my %md5s = @_; my %md5s = @_;
my ( $key, @files, $i ); my ( $key, @files, $i, $numkeys );
my $start = $opts{s} ? 1 : 0; my $start = $opts{s} ? 1 : 0;
if ( $opts{a} ) { $numkeys = 0; } else { $numkeys = 1; }
foreach $key (keys %md5s) { foreach $key (keys %md5s) {
if ( @{$md5s{$key}} > 1 ) { if ( @{$md5s{$key}} > $numkeys ) {
if ( scalar @dirs > 0 ) {
@files = sort dirsort @{$md5s{$key}}; @files = sort dirsort @{$md5s{$key}};
} else {
@files = @{$md5s{$key}};
}
for $i ($start .. $#files) { for $i ($start .. $#files) {
chomp $files[$i]; chomp $files[$i];
if ($opts{d}) { if ($opts{d}) {
@ -253,8 +298,10 @@ sub help {
Usage: $name [OPTION] ... Usage: $name [OPTION] ...
-a output all files
-d delete resulting files -d delete resulting files
-e escape output filenames with backslashes -e escape output filenames with backslashes
-f skip first line
-h display this help message -h display this help message
-l hardlink resulting files (no change if on -l hardlink resulting files (no change if on
different filesystems) different filesystems)