Datum: 2004-02-16
Quelle: debian-user-german
Hardlinks in einem Unix-System werden lediglich als neuer Verweis mit anderem Namen in der Verzeichnisstruktur gespeichert. Alle Hardlinks einer Datei haben aber die gleiche I-Node, das kann man nutzen, um sie zu finden. Der find kann nämlich nach Dateien suchen, die einen Verweiszähler größer als 1 haben, das trifft für alle Dateien zu, für die Hardlinks existieren. Ich habe zur Demonstration ein Verzeichnis mit ein paar Hardlinks angelegt.
jan@jack:~/tmp/hl> touch file1 file3 file4 jan@jack:~/tmp/hl> mkdir dir jan@jack:~/tmp/hl> ln file1 file2 jan@jack:~/tmp/hl> ln file1 dir/file1 jan@jack:~/tmp/hl> ln file3 dir/file2 jan@jack:~/tmp/hl> ls -iR1 .: 8701132 dir 8701130 file1 8701130 file2 8701133 file3 8701134 file4 ./dir: 8701130 file1 8701133 file2 jan@jack:~/tmp/hl> # GNU find jan@jack:~/tmp/hl> find . -type f -links +1 -printf "%i %p\n" | sort 8701130 ./dir/file1 8701130 ./file1 8701130 ./file2 8701133 ./dir/file2 8701133 ./file3 jan@jack:~/tmp/hl> # other find jan@jack:~/tmp/hl> find . -type f -links +1 -print | xargs ls -i | sort 8701130 ./dir/file1 8701130 ./file1 8701130 ./file2 8701133 ./dir/file2 8701133 ./file3
Die (leider nur im GNU find vorhandene) Option -printf gibt für jede reguläre Datei mit einem Verweiszähler größer als 1 ihre I-Node und ihren Pfadnamen aus. Damit stehen nach dem sort alle zu einer Datei gehörenden Hardlinks untereinander. Die Ausgabeliste lässt sich dann leicht bearbeiten. Die Version für einen Nicht-GNU find muss noch einen xargs ls -i einschieben.