Es gibt viele Antworten mit Skripten, um alle Hardlinks in einem Dateisystem zu finden. Die meisten von ihnen machen dumme Sachen, wie das Ausführen von find, um das gesamte Dateisystem -samefile
nach JEDER mit mehreren verknüpften Dateien zu durchsuchen. Das ist verrückt; Sie müssen lediglich nach Inode-Nummern sortieren und Duplikate drucken.
find directories.. -xdev ! -type d -links +1 -printf '%20D %20i %p\n' | sort -n | uniq -w 42 --all-repeated=separate
(Danke an @Tino für die Optimierung meines ursprünglichen Befehls, um eine FS-id ( %D
) zu unterstützen, und um alle Nicht-Verzeichnis-Dateitypen zu behandeln, nicht nur reguläre Dateien. Dadurch werden Ihre mehrfach verknüpften Symlinks, Pipes usw. gefunden.)
Das ! -type d -links +1
bedeutet, dass die Eingabe von sort nur so groß ist wie die endgültige Ausgabe von uniq. Es sei denn, Sie führen es in einem Unterverzeichnis aus, das nur einen Satz von Hardlinks enthält. Auf jeden Fall wird dadurch eine viel weniger CPU-Zeit benötigt, die das Dateisystem erneut durchläuft als jede andere veröffentlichte Lösung.
Beispielausgabe:
... 2429 76732484 /home/peter/weird-filenames/test/.hiddendir/foo bar 2429 76732484 /home/peter/weird-filenames/test.orig/.hiddendir/foo bar 2430 17961006 /usr/bin/pkg-config.real 2430 17961006 /usr/bin/x86_64-pc-linux-gnu-pkg-config 2430 36646920 /usr/lib/i386-linux-gnu/dri/i915_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/i965_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/nouveau_vieux_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/r200_dri.so 2430 36646920 /usr/lib/i386-linux-gnu/dri/radeon_dri.so ...
TODO ?: Aufheben der Ausgabe. uniq
hat eine sehr begrenzte Unterstützung für die Feldauswahl, daher füge ich die Suchausgabe auf und verwende eine feste Breite. 20 Zeichen ist breit genug für die maximal mögliche Inode- oder Gerätenummer (2 ^ 64-1 = 18446744073709551615). XFS wählt Inode-Nummern basierend auf dem zugewiesenen Speicherplatz auf der Festplatte, nicht zusammenhängend von 0, sodass große XFS-Dateisysteme> 32-Bit-Inode-Nummern haben können, auch wenn sie keine Milliarden von Dateien haben. Andere Dateisysteme haben möglicherweise 20-stellige Inode-Nummern, auch wenn sie nicht gigantisch sind.
TODO: Sortiert Gruppen von Duplikaten nach Pfad. Wenn sie nach Mount-Punkt sortiert sind, mischt die Inode-Nummer die Dinge zusammen, wenn Sie mehrere Subdirs haben, die viele Hardlinks enthalten. (dh Gruppen von Dup-Gruppen gehören zusammen, aber die Ausgabe mischt sie zusammen).
Ein Finale sort -k 3
würde Zeilen separat sortieren, nicht Zeilengruppen als einzelnen Datensatz. Vorverarbeitung mit etwas, um ein Paar Zeilenumbrüche in ein NUL-Byte zu verwandeln, und die Verwendung von GNU sort --zero-terminated -k 3
könnte den Trick erfüllen . tr
Funktioniert nur für einzelne Zeichen, jedoch nicht für Muster mit 2> 1 oder 1> 2. perl
würde es tun (oder einfach nur perl oder awk parsen und sortieren). sed
könnte auch funktionieren.