use File::Compare;
use File::Temp;
-# Copyright (C) 2002-2010 Zygo Blaxell <faster-dupemerge@mailtoo.hungrycats.org>
+# Copyright (C) 2002-2012 Zygo Blaxell <faster-dupemerge@mailtoo.hungrycats.org>
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
my $surprises = 0;
eval '
- use Digest::SHA1 qw(sha1 sha1_hex sha1_base64);
+ use Digest::SHA qw(sha1 sha1_hex sha1_base64);
';
if ($@) {
- warn "Digest::SHA1: $@\nUsing external md5sum program to generate hashes.\nPlease install Digest::SHA1 (libdigest-sha1-perl)";
+ warn "Digest::SHA: $@\nUsing external md5sum program to generate hashes.\nPlease install Digest::SHA";
eval <<'DIGEST';
sub really_digest {
sub really_digest {
my ($filename) = (@_);
die "'$filename' is not a plain file" if (-l $filename) || ! (-f _);
- my $ctx = Digest::SHA1->new;
+ my $ctx = Digest::SHA->new;
sysopen(FILE, $filename, O_RDONLY|O_NONBLOCK) or die "open: $filename: $!";
binmode(FILE); # FIXME: Necessary? Probably harmless...
$ctx->addfile(\*FILE);
S, s - lstat(2) (see source for details)
U - unlink(2)
. - all inodes with similar attributes done
+ (123456) - current file size in bytes
--sort pass next options (up to --) to sort command
--timestamps mtime may be different for identical files
- --skip-compare skip byte-by-byte file comparisons
+ --skip-compare skip byte-by-byte file comparisons,
+ compare only file hashes
--skip-hash[=N] skip calculation of hash function on files
larger than N bytes (default 1M).
--verbose report files as they are considered
--zeros hard-link zero-length files too
+
+--skip-compare and --skip-hash can be combined, in which case a file is
+either hashed (if it is below the --skip-hash size threshold) or compared
+(if it is above), but never both.
+
+Version: 0.20120914
USAGE
}
} elsif ($arg eq '--zeros') {
$collapse_zero = 1;
} elsif ($arg eq '--trust' || $arg eq '--skip-compare') {
- $skip_compare_preference = 1;
+ $skip_compares = $skip_compare_preference = 1;
} elsif ($arg =~ /^--skip-hash(?:=(\d+)([KkMmGgTt]?))?$/os) {
my ($quantity, $unit) = ($1, $2);
$unit ||= '_';
}
}
-@directories or usage;
+@directories or usage($0);
if (defined($lock_file) && !$dry_run) {
sysopen(LOCK_FILE, $lock_file, O_CREAT|O_RDONLY, 0666) or die "open: $lock_file: $!";
}
if (format_inode($incumbent_dev, $incumbent_ino) ne $incumbent) {
- warn "$incumbent_file: expected inode $incumbent, found $incumbent_dev:$incumbent_ino";
+ warn "$incumbent_file: expected inode $incumbent, found ".format_inode($incumbent_dev, $incumbent_ino);
$surprises++;
next incumbent_file;
}
}
if (format_inode($candidate_dev, $candidate_ino) ne $candidate) {
- warn "$candidate_file: expected inode $candidate, found $candidate_dev:$candidate_ino";
+ warn "$candidate_file: expected inode $candidate, found ".format_inode($candidate_dev, $candidate_ino);
$surprises++;
next candidate_file;
}
print STDERR "weak_key=$weak_key inode=$inode name=$name\n" if $debug;
- if ($size >= $skip_hashes_threshold) {
+ if ($skip_hashes_threshold && $size >= $skip_hashes_threshold) {
$skip_hashes = 1;
$skip_compares = 0;
} else {
sub space_numbers {
my ($num) = @_;
- 1 while $num =~ s/(\d)(\d\d\d)( \d\d\d)*$/$1 $2$3/os;
+ 1 while $num =~ s/(\d)(\d\d\d)((?: \d\d\d)*)$/$1 $2$3/os;
$num = ' ' x ($max_num_len - length($num)) . $num;
return $num;
}