====== ln - Links erstellen ====== 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. ===== Voraussetzungen ===== * Zugriff auf die Linux-Kommandozeile * Grundkenntnisse in [[sammlung:bash_kommandos|Bash-Kommandos]] * Verständnis der [[sammlung:filesystem|Dateisystem-Struktur]] ===== Grundlegende Syntax ===== ln [OPTIONEN] ZIEL LINKNAME ln -s [OPTIONEN] ZIEL LINKNAME # Symbolischer Link ===== Link-Typen ===== ==== Symbolische Links (Symlinks) ==== 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:** * Verweist auf Pfadnamen (nicht Inode) * Kann auf Dateien und Verzeichnisse zeigen * Kann über Dateisystem-Grenzen hinweg erstellt werden * Funktioniert nicht mehr wenn Ziel gelöscht wird (broken link) * Hat eigenen Inode ==== Harte Links (Hardlinks) ==== 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:** * Verweist auf denselben Inode wie Original * Nur für Dateien (nicht für Verzeichnisse) * Muss im selben Dateisystem sein * Datei existiert solange mindestens ein Link existiert * Identische Rechte und Zeitstempel ===== Unterschiede Symlink vs. Hardlink ===== ^ 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 | ===== Häufige Anwendungsfälle ===== ==== Aliase und Shortcuts ==== # 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 ==== Versionsverwaltung ==== # 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 ==== Backup und Speicherplatz ==== # 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 ===== Wichtige Optionen ===== ^ 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 | ===== Praktische Beispiele ===== ==== Symlinks erstellen ==== # 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/ ==== Hardlinks erstellen ==== # 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 ==== Links verwalten ==== # 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 anzeigen und prüfen ===== # 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 ===== Fortgeschrittene Nutzung ===== ==== Relative Symlinks ==== # 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 ==== Hardlink-Gruppen ==== # 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 ==== Atomic Link-Updates ==== # Sicherer Link-Wechsel (atomic) ln -sf /new/target temp_link mv -f temp_link final_link # Nützlich für zero-downtime deployments ===== Häufige Probleme ===== ==== Broken Symlinks ==== # 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 ==== Zirkuläre Links ==== # 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 ==== Hardlink-Limitierungen ==== # 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 ===== Use Cases in der Praxis ===== ==== Webserver-Konfiguration ==== # 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 ==== Shared Libraries ==== # 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 ==== Alternative Programme ==== # Python-Version wechseln sudo ln -sf /usr/bin/python3.9 /usr/bin/python3 # Editor-Auswahl sudo ln -sf /usr/bin/vim /usr/bin/editor ===== Hinweise ===== * **Symlinks bevorzugen** wenn möglich - flexibler und sicherer * **Absolute Pfade** für system-weite Links verwenden * **Relative Pfade** für portable Verzeichnisbäume * **Broken Links** regelmäßig suchen und aufräumen * **Vorsicht** mit ''-f'' - überschreibt ohne Warnung * **Hardlinks** sparen Platz aber sind schwerer zu tracken ===== Siehe auch ===== * [[sammlung:cd_pwd_cp_mv_rm|Dateiverwaltung - cp, mv, rm]] * [[sammlung:ls|ls - Verzeichnisse auflisten]] * [[sammlung:find|find - Dateien suchen]] * [[sammlung:filesystem|Linux Dateisystem-Struktur]] ---- {{tag>cli file utilities}} ----