File::Find::Duplicates von Tony Bowden durchsucht Verzeichnisse nach mehrfach vorhandenen Dateien.
Vorgehensweise
Zunächst erstellt File::Find::Duplicates Listen von Dateien identischer Größe.
Nur für Dateien der selben Größe wird eine MD5 Prüfsumme erstellt.
Dateien gelten als identisch, wenn sowohl Größe als auch MD5-Prüfsumme übereinstimmen.
Diese Vorgehensweise erzielt eine hohe Geschwindigkeit und nimmt dafür eine sehr geringe Wahrscheinlichkeit für "False Positives" in Kauf.
Beispiel
Dieses einfache Beispielprogramm nimmt eine Liste von Verzeichnissen als Kommandozeilenargumente entgegen, durchsucht diese rekursiv und gibt die gefunden Duplikate (Name,Größe, MD5) aus.
find_duplicate_files liefert im Erfolgsfall eine Liste von Objekten zurück, welche die Methoden size(), md5() und files() zur Verfügung stellen.
Im Misserfolgsfall (keine Duplikate) wird eine leere Liste zurückgegeben.
#!/usr/bin/perl use strict; use warnings; use File::Find::Duplicates; my @dirs = @ARGV; # Basic Sanity Check usage() unless scalar @ARGV > 1; my @dupesets = find_duplicate_files(@dirs); foreach my $dupeset (@dupesets) { print "Duplicate files: ", join(", ", @{ $dupeset->files } ), "\n"; print "MD5: ", $dupeset->md5, "\n"; print "Size: ", $dupeset->size, " Bytes\n"; print "\n"; } sub usage { warn "Usage: $0 DIR1 DIR2\n"; exit; }
Das Programm erzeugt z.B. folgende Ausgabe:
perl basic.pl . /tmp/ Duplicate files: ./basic.pl, /tmp/basic.pl MD5: 9bc2302a67edcd34e3f3cd44f6d5284b Size: 465 Bytes