Line # Revision Author
1 38 dpavlin #!/usr/bin/perl -w
2
3 40 dpavlin =head1 NAME
4 38 dpavlin
5 40 dpavlin fdupes-ln.pl - Find duplicates and hardlink them
6
7 =head1 SYNOPSIS
8
9 fdupes-ln.pl dir [dir dir...]
10
11 =head1 DESCRIPTION
12
13 Small script which uses fdupes from L<http://premium.caribe.net/~adrian2/fdupes.html>
14 to find and hardlink all files which are similar.
15
16 =head1 AUTHOR
17
18 Dobrica Pavlinusic <dpavlin@rot13.org>
19
20 L<http:E<sol>E<sol>www.rot13.orgE<sol>~dpavlinE<sol>>
21
22 =cut
23
24 38 dpavlin use strict;
25
26 40 dpavlin my $debug = 0;
27 38 dpavlin
28 foreach my $dir (@ARGV) {
29 41 dpavlin next unless -d $dir;
30
31 38 dpavlin warn "finding duplicates in $dir\n";
32
33 43 dpavlin open(my $p, '-|', "fdupes -1 -r $dir") || die "can't run fdupes -r $dir: $!\n";
34 38 dpavlin
35 while(<$p>) {
36 next if (/md5sum/);
37
38 s/\\ /_%20_/g;
39
40 my @dupes = split(/\s/, $_);
41
42 my $l;
43 map {
44 my $p = $_;
45 $p =~ s/_%20_/ /g;
46 46 dpavlin $l->{$p} = (stat($p))[3]; # nr links
47 38 dpavlin } @dupes;
48
49 my @sorted = sort { $l->{$b} <=> $l->{$a} } @dupes;
50
51 my $master = shift @sorted;
52 $master =~ s/_%20_/ /g;
53 warn "using $master [", $l->{$master}, "] for ", scalar(@dupes) , " dupes\n";
54
55 foreach my $path ( @sorted ) {
56 $path =~ s/_%20_/ /g;
57 warn "ln -f $master $path # ", (stat($master))[3], ":", (stat($path))[3], "\n" if ($debug);
58 unlink $path or die "can't unlink $path: $!\n";
59 link $master, $path or die "can't link $master -> $path: $!\n";
60 }
61 }
62 }
63