X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=faster-dupemerge;h=7e899ddc8eb8ae4f87770d42a33efe4acca43b95;hb=6910de85c5daa8b99a1ea7d6e4614584fbfdfec5;hp=f1413b47e10a7d60364c14d532efdcdb049a76f0;hpb=1c211f4055c67cfbf832d057d5b8bb3c7bf6d21c;p=dupemerge diff --git a/faster-dupemerge b/faster-dupemerge index f1413b4..7e899dd 100755 --- a/faster-dupemerge +++ b/faster-dupemerge @@ -4,7 +4,7 @@ use Fcntl qw(:DEFAULT :flock); use File::Compare; use File::Temp; -# Copyright (C) 2003-2010 Zygo Blaxell +# Copyright (C) 2002-2010 Zygo Blaxell # 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 @@ -134,24 +134,33 @@ hard links). --debug show all steps in duplication discovery process (implies --verbose) - --dry-run do not lock files or make changes to filesystem + --dry-run do not lock files or make changes to filesystem --find pass next options (up to --) to find command - --humane human-readable statistics (e.g. 1 048 576) + --humane human-readable statistics (e.g. 1 048 576) --lock FILE exit immediately (status 10) if unable to obtain a flock(LOCK_EX|LOCK_NB) on FILE - --lock-rm remove lock file at exit + --lock-rm remove lock file at exit + + --progress output single-character progress indicators: + C - compare + H - hash + L - link(2) + R - rename(2) + S, s - lstat(2) (see source for details) + U - unlink(2) + . - all inodes with similar attributes done --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 - --skip-hash skip calculation of hash function on files + --skip-hash skip calculation of hash function on files --trust old name for --skip-compare (trust the hash function) @@ -331,10 +340,11 @@ hash_file: print STDERR "\t\tDigesting file $filename\n" if $debug; if ((-l $filename) || ! -f _) { warn "Bogon file " . tick_quote($filename); - $surprises++; + $input_bogons++; + delete $inode_to_file_name{$candidate}->{$filename}; next; } - eval { + eval { $digest = digest($filename); }; if ($@) { @@ -370,7 +380,7 @@ incumbent_file: my ($incumbent_dev,$incumbent_ino,$incumbent_mode,$incumbent_nlink,$incumbent_uid,$incumbent_gid,$incumbent_rdev,$incumbent_size,$incumbent_atime,$incumbent_mtime,$incumbent_ctime,$incumbent_blksize,$incumbent_blocks) = lstat($incumbent_file); print STDERR "\t\tINCUMBENT dev=$incumbent_dev ino=$incumbent_ino mode=$incumbent_mode nlink=$incumbent_nlink uid=$incumbent_uid gid=$incumbent_gid rdev=$incumbent_rdev size=$incumbent_size atime=$incumbent_atime mtime=$incumbent_mtime ctime=$incumbent_ctime blksize=$incumbent_blksize blocks=$incumbent_blocks _=$incumbent_file\n" if $debug; - if (!defined($incumbent_blocks)) { + if (!defined($incumbent_blocks) || ! (-f _)) { warn "lstat: $incumbent_file: $!"; $surprises++; next incumbent_file; @@ -391,7 +401,7 @@ candidate_file: my ($candidate_dev,$candidate_ino,$candidate_mode,$candidate_nlink,$candidate_uid,$candidate_gid,$candidate_rdev,$candidate_size,$candidate_atime,$candidate_mtime,$candidate_ctime,$candidate_blksize,$candidate_blocks) = lstat($candidate_file); print STDERR "\t\t\tCANDIDATE dev=$candidate_dev ino=$candidate_ino mode=$candidate_mode nlink=$candidate_nlink uid=$candidate_uid gid=$candidate_gid rdev=$candidate_rdev size=$candidate_size atime=$candidate_atime mtime=$candidate_mtime ctime=$candidate_ctime blksize=$candidate_blksize blocks=$candidate_blocks _=$candidate_file\n" if $debug; - if (!defined($candidate_blocks)) { + if (!defined($candidate_blocks) || ! (-f _)) { warn "lstat: $candidate_file: $!"; $surprises++; next candidate_file; @@ -553,10 +563,10 @@ candidate_file: delete $inode_to_file_name{$candidate}; } } + print STDERR '.' if $progress; end_merge: - print STDERR '.' if $progress; print STDERR "Merge done.\n" if $debug; undef %inode_to_file_name; } @@ -569,12 +579,6 @@ while () { print STDERR "weak_key=$weak_key inode=$inode name=$name\n" if $debug; - unless (! (-l $name) && (-f _)) { - warn "Bogon file " . tick_quote($name); - $input_bogons++; - next; - } - $input_links++; merge_files if $weak_key ne $current_key; $current_key = $weak_key; @@ -633,6 +637,7 @@ if ($humane) { $stats_blob =~ s/([^\n]*\n[^\n]*? )(\s+)( [^\n]*\n)/$1 . ('.' x length($2)) . $3/oemg; +print STDERR "\n" if $progress; print STDERR $stats_blob; exit(0);