nieuwe vlaggetjes
This commit is contained in:
parent
ad09108fde
commit
b9bfa6e1dd
1 changed files with 67 additions and 20 deletions
|
|
@ -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 {
|
} else {
|
||||||
my %sizes = &get_sizes(@filelist);
|
if ( $opts{f} ) {
|
||||||
&quick_comp(%sizes);
|
&get_md5s(@filelist);
|
||||||
|
} else {
|
||||||
|
my %sizes = &get_sizes(@filelist);
|
||||||
|
&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 ) {
|
||||||
@files = sort dirsort @{$md5s{$key}};
|
if ( scalar @dirs > 0 ) {
|
||||||
|
@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)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue