Soft- und Hard-Links auf eine Datei finden

Datum: 2004-11-22
Quelle: suse-linux

Worum ging es?

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.

Code
### 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$"
Beschreibung

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.