ln — Hard- und Symlinks erstellen
Praxis-Guide zu ln: harte Links und symbolische Links (Symlinks) zu Dateien und Verzeichnissen anlegen, verwalten und den Unterschied verstehen.
ln legt Verknüpfungen zwischen Dateien an – entweder einen symbolischen Link (Symlink), der wie eine Verknüpfung auf einen Pfad zeigt, oder einen harten Link, bei dem mehrere Namen denselben Inode und damit dieselben Daten referenzieren. Die wichtigste Stolperfalle ist die Argument-Reihenfolge: Sie lautet immer ln -s <ziel> <linkname>, also zuerst das Ziel, dann der Name des neuen Links – wer das vertauscht, legt den Link am falschen Ort an. Dieser Guide zeigt dir Symlinks und Hardlinks, den entscheidenden Unterschied zwischen beiden sowie typische Muster wie atomare Deployments und Dotfile-Verwaltung.
Symbolische Links (Soft Links)
ln -s <target> <link> — Erstellt einen symbolischen Link, der auf das Ziel zeigt.
ln -s /var/log/syslog ~/syslogln -s <target> — Erstellt im aktuellen Verzeichnis einen Symlink mit demselben Namen wie das Ziel.
ln -s /etc/nginx/nginx.confln -sf <target> <link> — Erstellt oder überschreibt einen symbolischen Link (force).
ln -sf /usr/bin/python3.12 /usr/bin/python3ln -sn <target> <link> — Dereferenziert den Link nicht, falls er ein Symlink auf ein Verzeichnis ist. Nützlich, um Verzeichnis-Symlinks zu ersetzen.
ln -sfn /var/www/release-2.0 /var/www/currentln -s <target1> <target2> <dir> — Erstellt mehrere Symlinks in einem Zielverzeichnis.
ln -s /opt/bin/app1 /opt/bin/app2 /usr/local/bin/Harte Links
ln <target> <link> — Erstellt einen harten Link. Beide Namen zeigen auf denselben Inode und dieselben Daten.
ln important.txt important-backup.txtln <target> — Erstellt im aktuellen Verzeichnis einen harten Link mit demselben Namen.
ln /data/shared-config.txtln <target1> <target2> <dir> — Erstellt harte Links zu mehreren Dateien in einem Zielverzeichnis.
ln file1.txt file2.txt /backup/ln -f <target> <link> — Erzwingt die Erstellung, indem die vorhandene Zieldatei entfernt wird.
ln -f newdata.txt data.txtHarte Links vs. symbolische Links
ln <target> <link> — Harter Link: gleicher Inode, nur im selben Dateisystem, übersteht Umbenennen/Verschieben des Ziels.
ln original.txt hardlink.txtln -s <target> <link> — Symbolischer Link: eigener Inode, über Dateisystemgrenzen hinweg, wird ungültig, wenn das Ziel entfernt wird.
ln -s original.txt symlink.txtls -li <file> — Zeigt die Inode-Nummer. Harte Links teilen sich denselben Inode wie ihr Ziel.
ls -li original.txt hardlink.txtstat <file> — Zeigt ausführliche Datei-Infos inklusive Inode und Anzahl harter Links.
stat original.txtOptionen
ln -v <target> <link> — Ausführlicher Modus. Gibt jeden erstellten Link aus.
ln -sv /opt/app/config.yml ~/config.ymlln -i <target> <link> — Interaktiver Modus. Fragt vor dem Überschreiben vorhandener Dateien nach.
ln -si /new/target existing-linkln -b <target> <link> — Legt vor dem Überschreiben ein Backup der vorhandenen Zieldatei an.
ln -sb /new/target existing-linkln -S <suffix> <target> <link> — Setzt die Backup-Endung (Standard: ~) bei Verwendung von -b.
ln -sb -S .bak /new/target existing-linkln -r -s <target> <link> — Erstellt einen relativen statt eines absoluten symbolischen Links.
ln -rs /var/www/shared/assets /var/www/app/assetsln -t <dir> -s <target> — Gibt das Link-Verzeichnis mit -t explizit an.
ln -t /usr/local/bin -s /opt/app/bin/toolLinks verwalten
readlink <link> — Gibt das Ziel eines symbolischen Links aus.
readlink /usr/bin/python3readlink -f <link> — Gibt den vollständig aufgelösten absoluten Pfad aus (folgt allen Symlinks).
readlink -f /usr/bin/pythonls -l <link> — Zeigt das Symlink-Ziel im ausführlichen Listing (-> ziel).
ls -l /usr/bin/python3file <link> — Zeigt, ob ein Pfad ein Symlink ist und wohin er zeigt.
file /usr/bin/python3unlink <link> — Entfernt einen symbolischen oder harten Link (lässt das Ziel unberührt).
unlink ~/syslogrm <link> — Entfernt einen Link. Bei einzelnen Dateien wie unlink.
rm ~/syslogfind . -type l — Findet alle symbolischen Links im aktuellen Verzeichnisbaum.
find /etc -type lfind . -xtype l — Findet defekte symbolische Links (Ziel existiert nicht).
find /usr/local/bin -xtype lHäufige Muster
ln -sfn <release-dir> <current> — Atomares Deployment: schaltet einen Symlink auf ein neues Release-Verzeichnis um.
ln -sfn /var/www/releases/v2.1 /var/www/currentln -s /path/to/dotfile ~/.dotfile — Dotfile-Verwaltung: verlinkt Konfigurationsdateien aus einem zentralen Repo.
ln -s ~/dotfiles/.vimrc ~/.vimrcln -s $(which <cmd>) /usr/local/bin/<alias> — Erstellt einen Befehls-Alias per Symlink.
ln -s $(which python3) /usr/local/bin/pythonfor f in <dir>/*; do ln -s "$f" .; done — Erstellt Symlinks zu allen Dateien in einem Verzeichnis.
for f in /opt/config/*; do ln -s "$f" .; doneln -s /dev/null <file> — Unterdrückt eine Datei, indem sie auf /dev/null zeigt (z. B. unerwünschte Logs).
ln -sf /dev/null ~/.bash_historyfind . -type l ! -exec test -e {} \; -print — Findet und listet alle defekten Symlinks auf.
find /usr/local -type l ! -exec test -e {} \; -printfind . -maxdepth 1 -type l -delete — Entfernt alle Symlinks im aktuellen Verzeichnis (nicht rekursiv).
find . -maxdepth 1 -type l -delete Fazit
ln ist klein, aber wirkungsvoll – wichtig ist, die beiden Link-Arten auseinanderzuhalten: Ein Symlink (-s) ist nur ein Verweis auf einen Pfad, funktioniert über Dateisystemgrenzen hinweg, wird aber ungültig, wenn das Ziel verschwindet; ein harter Link ist ein gleichwertiger zweiter Name für dieselben Daten, bleibt auch nach Umbenennen des Ziels gültig, ist aber auf ein Dateisystem beschränkt und für Verzeichnisse nicht erlaubt. Merke dir die Argument-Reihenfolge ln -s <ziel> <linkname> und nutze -sfn für das atomare Umschalten von Verzeichnis-Symlinks (klassischer Deployment-Trick). Prüfe mit ls -li und stat Inode und Link-Anzahl, wenn du unsicher bist, was wohin zeigt.
Weiterführende Links
- ubuntuusers-Wiki: ln – deutschsprachige Erklärung von harten und symbolischen Links
- GNU coreutils: ln invocation – offizielle Referenz aller Optionen (englisch)