ln erstellt Links zwischen Dateien. Es gibt zwei Arten: symbolische Links (Symlinks), die auf einen Dateipfad verweisen, und harte Links (Hardlinks), die auf denselben Inode wie die Originaldatei verweisen. Links sind nützlich für Aliase, Versionsverwaltung und Speicherplatzoptimierung.
ln [OPTIONEN] ZIEL LINKNAME ln -s [OPTIONEN] ZIEL LINKNAME # Symbolischer Link
Ein symbolischer Link ist eine spezielle Datei, die auf einen Pfad verweist.
# Symlink erstellen ln -s /pfad/zur/datei.txt link_name # Symlink zu Verzeichnis ln -s /var/www/html website # Absolute Pfade verwenden ln -s /usr/local/bin/python3 /usr/bin/python # Relative Pfade ln -s ../config.ini link_config
Eigenschaften:
Ein harter Link ist ein zusätzlicher Verzeichnis-Eintrag für dieselbe Datei.
# Hardlink erstellen ln datei.txt hardlink_name # Mehrere Hardlinks ln original.txt copy1.txt copy2.txt copy3.txt
Eigenschaften:
| Merkmal | Symbolischer Link | Harter Link |
|---|---|---|
| Ziel | Pfadname | Inode |
| Verzeichnisse | Ja | Nein |
| Dateisysteme | Über Grenzen | Nur gleiches FS |
| Broken Link | Möglich | Nicht möglich |
| Größe | Klein (~Pfadlänge) | Gleich wie Original |
| Inode | Eigener | Identisch |
| Rechte | Eigene (meist 777) | Identisch |
# Programm-Alias ln -s /opt/program/bin/app /usr/local/bin/app # Shortcuts zu wichtigen Verzeichnissen ln -s /var/log/nginx ~/nginx-logs ln -s /etc/nginx/sites-available ~/sites # Desktop-Link ln -s ~/Dokumente/wichtig ~/Desktop/wichtig
# Aktuell-Link für verschiedene Versionen ln -s /opt/app-1.2.3 /opt/app-current # Update durch Link-Wechsel rm /opt/app-current ln -s /opt/app-1.3.0 /opt/app-current # PHP-Versionen ln -s /usr/bin/php8.1 /usr/bin/php
# Hardlinks für Backup (Space-Efficient) ln original.txt backup/original.txt # Mehrere Namen für dieselbe Datei ln script.sh run-script.sh ln script.sh execute.sh
| Option | Bedeutung |
|---|---|
| -s | Symbolischen Link erstellen |
| -f | Bestehenden Link überschreiben (force) |
| -n | Link zu Verzeichnis nicht dereferenzieren |
| -r | Relativen Pfad für Symlink verwenden |
| -v | Verbose (zeigt was gemacht wird) |
| -b | Backup vor Überschreiben |
| -t | Zielverzeichnis angeben |
# Einfacher Symlink ln -s /usr/share/doc/readme.txt ~/readme # Mit force (überschreiben) ln -sf /new/target existing_link # Relativer Symlink ln -sr ../config.ini link # Mehrere Links in Zielverzeichnis ln -s /source/*.txt /target/
# Einfacher Hardlink ln original.dat copy.dat # Mehrere Hardlinks gleichzeitig ln file.txt hardlink1.txt hardlink2.txt # In anderes Verzeichnis ln /path/to/file.txt /other/path/file.txt
# Link löschen (Ziel bleibt erhalten) rm symlink_name unlink symlink_name # Link überschreiben ln -sf /new/target existing_link # Alle Symlinks in Verzeichnis finden find . -type l # Broken Links finden find . -type l ! -exec test -e {} \; -print # Link-Ziel anzeigen readlink symlink_name readlink -f symlink_name # Absoluter Pfad
# Links mit ls anzeigen ls -l # lrwxrwxrwx ... link -> /target # Link-Ziel auflösen readlink link_name # Prüfen ob Datei ein Link ist test -L filename && echo "Ist ein Link" # Inode anzeigen (Hardlinks haben gleiche) ls -i file1.txt file2.txt # Link-Details stat link_name # Hardlink-Count anzeigen ls -l # Spalte 2 zeigt Anzahl
# Manuell relativ cd /target/directory ln -s ../../source/file.txt link # Automatisch relativ ln -sr /source/file.txt /target/link # Vorteil: Portabel bei Verschieben des gesamten Baums
# Alle Hardlinks einer Datei finden find / -samefile original.txt 2>/dev/null # Oder per Inode INODE=$(ls -i original.txt | awk '{print $1}') find / -inum $INODE 2>/dev/null # Hardlink-Count prüfen stat -c %h original.txt
# Sicherer Link-Wechsel (atomic) ln -sf /new/target temp_link mv -f temp_link final_link # Nützlich für zero-downtime deployments
# Problem: Ziel wurde gelöscht/verschoben ls -l broken_link # lrwxrwxrwx ... broken_link -> /non/existent (rot markiert) # Finden und reparieren find . -type l ! -exec test -e {} \; -print # Manuell anpassen: ln -sf /correct/target broken_link # Oder löschen find . -type l ! -exec test -e {} \; -delete
# Vermeiden: Link verweist auf sich selbst ln -s link1 link2 ln -s link2 link1 # Zirkel! # Erkennen: Führt zu "Too many levels of symbolic links" cat link1 # Fehler
# Funktioniert nicht für Verzeichnisse ln /source/dir /target/dir # Fehler # Funktioniert nicht über Dateisysteme ln /home/file.txt /mnt/usb/file.txt # Fehler # Lösung: Symlink verwenden ln -s /home/file.txt /mnt/usb/file.txt
# Nginx sites-enabled ln -s /etc/nginx/sites-available/mysite /etc/nginx/sites-enabled/ # Apache ln -s /etc/apache2/sites-available/mysite.conf /etc/apache2/sites-enabled/ # Deaktivieren durch Löschen des Links rm /etc/nginx/sites-enabled/mysite
# Bibliotheks-Versionierung ln -s libmylib.so.1.2.3 libmylib.so.1 ln -s libmylib.so.1 libmylib.so # System findet immer die richtige Version
# Python-Version wechseln sudo ln -sf /usr/bin/python3.9 /usr/bin/python3 # Editor-Auswahl sudo ln -sf /usr/bin/vim /usr/bin/editor
-f - überschreibt ohne Warnung