Datum: 2004-11-22
Quelle: suse-linux
Es soll überprüft werden, ob zu einer Datei Verweise (Hard- oder Softlinks) bestehen und wenn ja, wie diese heißen. Der untenstehende Code ist eine Kurzanleitung, wie man vorgehen kann.
### hard links # Dateieintrag anzeigen / list the file entry ls -li file # 451712 -rw-r--r-- 2 jan users 0 30. Mai 22:28 file # Spalte 1 / column 1 = I-Node # Spalte 3 / column 3 = link count (>1 = hard link existiert / hard link exists) # Dateien mit gleicher I-Node finden / find files with same i node find /path/to/filesystem -inum 451712 -print # ./file_hardlink # ./file ### symbolischer Verweis / soft link # finde alle symbolischen Links, deren Ziel "file" ist # find all soft links which point to "file" find / -lname '*file' -print | while read l; do # Pfad zum Linkziel / path to link destination p="`readlink \"$l\"`" # wechsle zuerst in das Verzeichnis des Links, dann in das # Verzeichnis des Ziels und gib dann den Link sowie den # aktuellen Pfad aus # first cd to the link's directory, then into the destination's # directory, then display link and current path cd "`dirname \"$l\"`" && cd "`dirname \"$p\"`" && \ echo "$l `pwd`/`basename \"$p\"`" # zuletzt alle Zeilen filtern, dei den Pfad zu "file" enthalten # last filter all lines for the path of my file done | grep " /absolute/path/to/file$"
Die Suche nach Hard Links ist relativ einfach, da man nur im aktuellen Dateisystem nach Dateien mit gleicher I-Node
suchen muss. Bei symbolischen Verweisen ist das etwas komplizierter, weil man es der Datei nicht ansieht, ob sie Ziel von
Symlinks ist, außerdem können Symlinks mit absoluten und relativen Pfaden angegeben werden. Darum wird im Code zuerst in
das Link-Verzeichnis und daraus in das Verzeichnis des Linkziels gewechselt, um den absoluten Pfad des Linkziels ermitteln zu
können.
GNU-find bietet die printf-Ausgabe "%l" an, die den
readlink ersparen kann.