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.

Shell: Leere Zeilen bei der Suche mit grep weg lassen

Dateien mit grep durchsuchen und dabei leere Zeilen weg lassen.

Manchmal ist es so einfach: Wie kann ich eine Datei, die viele mit „#“ kommentierte Zeilen hat, so ausgeben, dass nur die unkommentierten Zeilen ausgegeben werden?

grep -v ^# DATEINAME

Damit werden allerdings alle Zeilen mit „#“ am Anfang als leere Zeilen mit ausgegeben. Um dies zu verhindern kann man den Befehl noch erweitern:

grep -v ^# DATEINAME | grep -v ^$

FreeBSD: CDROM Laufwerk mounten

Eine kurze Beschreibung, wie eine CD oder DVD unter FreeBSD auf der Kommandozeile eingebunden werden kann.

Egal ob am phy. Server oder in einer virtuellen Maschine, es wird immer wieder notwendig, an einem FreeBSD System eine CD oder DVD einzubinden um Daten von dort zu kopieren. Anders als unter Windows oder den grafischen Frontends wie Gnome muss auf der Kommandozeile das entsprechende Geräte manuell eingebunden werden (im Normalfall).

Um das CD/DVD Gerät herauszufinden:

# dmesg | egrep -i 'cd|dvd'

Eine mögliche Ausgabe in einer virtuellen Maschine unter VMWARE wäre:

$ dmesg | egrep -i 'cd|dvd'
cd0 at ata1 bus 0 scbus1 target 0 lun 0
cd0: <NECVMWar VMware IDE CDR10 1.00> Removable CD-ROM SCSI-0 device
cd0: 33.300MB/s transfers (UDMA2, ATAPI 12bytes, PIO 65534bytes)
cd0: Attempt to query device size failed: NOT READY, Medium not present

Hier ist das Gerät „cd0“ zu erkennen um das es geht. Mit folgendem Befehl lässt sich ein dort eingelegter Datenträger einbinden:

mount_cd9660 /dev/cd0 /cdrom     # Das Verzeichnis /cdrom muss natürlich existieren

Die Vorgehensweise ähnelt natürlich der unter Linux oder anderen *nix Systemen.

Meine Quelle: http://www.cyberciti.biz/faq/freebsd-accessing-the-cdrom-drive-from-the-command-line/