FreeBSD: Dateiduplikate finden

Beschreibung

Wie findet man in einem Filesystem bzw. einem oder mehreren Verzeichnissen Dateien, die nicht unbedingt den gleichen Namen tragen oder im selben Verzeichnis liegen?

Hier kann das Tool fdupes (fdupes in der Wikipedia.org) helfen. Dieses existiert sowohl für FreeBSD, als auch für Linux. Das Tool bietet noch ein paar Besonderheiten:

  • Es vergleicht Dateien nicht nur anhand der Größe, sondern bildet über die Datei eine Checksumme und vergleicht diese. Anschließend erfolgt ein byte-to-byte Vergleich
  • Suchergebnisse können aufgelistet oder auch gleich gelöscht werden
  • Es besteht auch die Möglichkeit,  Duplikate per Hardlink (Hardlink in der Wikipedia.de) auf nur eine existierende Datei zu verlinken (Notwendig ist Option „-L“, welche ich nur unter Debian gefunden habe)

Installation

Unter FreeBSD kann es entweder mittels pkg oder über die Ports Collection (/usr/ports/sysutils/fdupes) installiert werden:

PKG: pkg install fdupes
PORTS: cd /usr/ports/sysutils/fdupes && make install clean

Anwendung

Als Beispiel nehme ich das Verzeichnis /usr/ports/lang auf einem FreeBSD System und wende die Parameter -r (rekursiv), -S (zeige Dateigröße) und -n (keine leeren Dateien) auf das aktuelle Verzeichnis (./) an:

root@bsd:/usr/ports/lang/ > fdupes -r -S -n ./
6308 bytes each:
./php5/files/extra-patch-php-fpm-ipv6
./php55/files/extra-patch-php-fpm-ipv6
./php56/files/extra-patch-php-fpm-ipv6

915 bytes each:
./pypy/files/patch-lib-python__2.7__distutils__sysconfig_pypy.py
./pypy-devel/files/patch-lib-python__2.7__distutils__sysconfig_pypy.py

1691 bytes each:
./pypy/files/patch-lib-python__2.7__distutils__command__install.py
./pypy-devel/files/patch-lib-python__2.7__distutils__command__install.py

178 bytes each:
./php52-extensions/pkg-descr
./php53-extensions/pkg-descr
./php5-extensions/pkg-descr

Zu erkennen ist, dass es in unterschiedlichen Verzeichnissen Dateien mit gleicher Größe und in diesem Fall mit gleichem Namen gibt.
Vergleicht man nun den Dateiinhalt (von Textdateien) miteinander, kann man verifizieren, ob es sich tatsächlich um die gleichen Files handelt:

root@bsd:/usr/ports/lang/ > diff -y --suppress-common-lines ./php55/pkg-message.mod ./php56/pkg-message.mod
root@bsd:/usr/ports/lang/ >

Diff wird mit den Parametern -y (zwei Spalten) und –suppress-common-lines (unterdrücke gleiche Inhalte) aufgerufen. Das Ergebnis des Vergleiches mit DIFF ist, dass es keine Unterschiede gibt.

 

Natürlich gibt es noch mehr Parameter, mit denen man fdupes aufrufen kann.

 

Was kann man nun damit machen?

Ein schönes Beispiel ist z. B. Backup mit fdupes und rsync (http://krausens-online.de/fdupes-hardlinks-und-backup-mit-rsync/).
Oder man sucht einfach nur nach gleichen Dateien.