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.

ln -s <target> <link> — Erstellt einen symbolischen Link, der auf das Ziel zeigt.

ln -s /var/log/syslog ~/syslog

ln -s <target> — Erstellt im aktuellen Verzeichnis einen Symlink mit demselben Namen wie das Ziel.

ln -s /etc/nginx/nginx.conf

ln -sf <target> <link> — Erstellt oder überschreibt einen symbolischen Link (force).

ln -sf /usr/bin/python3.12 /usr/bin/python3

ln -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/current

ln -s <target1> <target2> <dir> — Erstellt mehrere Symlinks in einem Zielverzeichnis.

ln -s /opt/bin/app1 /opt/bin/app2 /usr/local/bin/

ln <target> <link> — Erstellt einen harten Link. Beide Namen zeigen auf denselben Inode und dieselben Daten.

ln important.txt important-backup.txt

ln <target> — Erstellt im aktuellen Verzeichnis einen harten Link mit demselben Namen.

ln /data/shared-config.txt

ln <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.txt

ln <target> <link> — Harter Link: gleicher Inode, nur im selben Dateisystem, übersteht Umbenennen/Verschieben des Ziels.

ln original.txt hardlink.txt

ln -s <target> <link> — Symbolischer Link: eigener Inode, über Dateisystemgrenzen hinweg, wird ungültig, wenn das Ziel entfernt wird.

ln -s original.txt symlink.txt

ls -li <file> — Zeigt die Inode-Nummer. Harte Links teilen sich denselben Inode wie ihr Ziel.

ls -li original.txt hardlink.txt

stat <file> — Zeigt ausführliche Datei-Infos inklusive Inode und Anzahl harter Links.

stat original.txt

Optionen

ln -v <target> <link> — Ausführlicher Modus. Gibt jeden erstellten Link aus.

ln -sv /opt/app/config.yml ~/config.yml

ln -i <target> <link> — Interaktiver Modus. Fragt vor dem Überschreiben vorhandener Dateien nach.

ln -si /new/target existing-link

ln -b <target> <link> — Legt vor dem Überschreiben ein Backup der vorhandenen Zieldatei an.

ln -sb /new/target existing-link

ln -S <suffix> <target> <link> — Setzt die Backup-Endung (Standard: ~) bei Verwendung von -b.

ln -sb -S .bak /new/target existing-link

ln -r -s <target> <link> — Erstellt einen relativen statt eines absoluten symbolischen Links.

ln -rs /var/www/shared/assets /var/www/app/assets

ln -t <dir> -s <target> — Gibt das Link-Verzeichnis mit -t explizit an.

ln -t /usr/local/bin -s /opt/app/bin/tool

readlink <link> — Gibt das Ziel eines symbolischen Links aus.

readlink /usr/bin/python3

readlink -f <link> — Gibt den vollständig aufgelösten absoluten Pfad aus (folgt allen Symlinks).

readlink -f /usr/bin/python

ls -l <link> — Zeigt das Symlink-Ziel im ausführlichen Listing (-> ziel).

ls -l /usr/bin/python3

file <link> — Zeigt, ob ein Pfad ein Symlink ist und wohin er zeigt.

file /usr/bin/python3

unlink <link> — Entfernt einen symbolischen oder harten Link (lässt das Ziel unberührt).

unlink ~/syslog

rm <link> — Entfernt einen Link. Bei einzelnen Dateien wie unlink.

rm ~/syslog

find . -type l — Findet alle symbolischen Links im aktuellen Verzeichnisbaum.

find /etc -type l

find . -xtype l — Findet defekte symbolische Links (Ziel existiert nicht).

find /usr/local/bin -xtype l

Hä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/current

ln -s /path/to/dotfile ~/.dotfile — Dotfile-Verwaltung: verlinkt Konfigurationsdateien aus einem zentralen Repo.

ln -s ~/dotfiles/.vimrc ~/.vimrc

ln -s $(which <cmd>) /usr/local/bin/<alias> — Erstellt einen Befehls-Alias per Symlink.

ln -s $(which python3) /usr/local/bin/python

for 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" .; done

ln -s /dev/null <file> — Unterdrückt eine Datei, indem sie auf /dev/null zeigt (z. B. unerwünschte Logs).

ln -sf /dev/null ~/.bash_history

find . -type l ! -exec test -e {} \; -print — Findet und listet alle defekten Symlinks auf.

find /usr/local -type l ! -exec test -e {} \; -print

find . -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.

Verwandte Kommandos

  • cp – Dateien und Verzeichnisse kopieren
  • ls – Verzeichnisinhalte und Inodes anzeigen
  • stat – ausführliche Datei- und Inode-Informationen anzeigen