Hardlinks finden

Datum: 2004-02-16
Quelle: debian-user-german

Worum ging es?

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.

Code
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
Beschreibung

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.