====== 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}}
----