X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=dupemerge;a=blobdiff_plain;f=faster-dupemerge;h=4cdef9716fd5e5de600b9810a198936ca9d46301;hp=bc3a5afcbc180802af38153d471144ab5e31e6f4;hb=de7efbca76dfc8ca745d8dabc2f9a99d9af0e4b4;hpb=f8a17dc3c61e9daac88a105715e3584da6cec32a diff --git a/faster-dupemerge b/faster-dupemerge index bc3a5af..4cdef97 100755 --- a/faster-dupemerge +++ b/faster-dupemerge @@ -155,6 +155,7 @@ hard links). 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 @@ -185,7 +186,7 @@ while ($#ARGV >= 0) { } 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 ||= '_'; @@ -241,7 +242,7 @@ while ($#ARGV >= 0) { } } -@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: $!"; @@ -355,6 +356,7 @@ hash_file: foreach my $filename (sort keys(%{$inode_to_file_name{$candidate}})) { print STDERR "\t\tDigesting file $filename\n" if $debug; if ((-l $filename) || ! -f _) { + print STDERR "\n" if $progress; warn "Bogon file " . tick_quote($filename); $input_bogons++; delete $inode_to_file_name{$candidate}->{$filename}; @@ -403,7 +405,7 @@ incumbent_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; } @@ -424,7 +426,7 @@ candidate_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; } @@ -540,7 +542,7 @@ candidate_file: if ($link_done) { delete $inode_to_file_name{$to_inode}->{$to_file}; - $inode_to_file_name{$from_inode}->{$to_file} = undef; + $inode_to_file_name{$from_inode}->{$to_file} = undef unless ($dry_run); $hash_to_inode{$digest} = [ $from_inode ]; $hard_links++; @@ -587,6 +589,9 @@ end_merge: undef %inode_to_file_name; } +my $last_time = 0; +my $last_size = 0; + while () { my ($weak_key, $size, $dev, $ino, $name) = m/^((\d+) \d+ \d+ \d+ -?[\d.]+) (\d+) (\d+) (.+)\0$/so; die "read error: $!\nLast input line was '$_'" unless defined($name); @@ -595,7 +600,7 @@ while () { 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 { @@ -603,6 +608,15 @@ while () { $skip_compares = $skip_compare_preference; } + if ($progress) { + my $this_time = time(); + if ($this_time != $last_time && $size != $last_size) { + $last_time = $this_time; + $last_size = $size; + print STDERR "($size)"; + } + } + $input_links++; merge_files if $weak_key ne $current_key; $current_key = $weak_key; @@ -651,7 +665,7 @@ if ($humane) { 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; }