[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal:Ein Terminal öffnen] }}} [[Inhaltsverzeichnis()]] [[Bild(Wiki/Icons/terminal.png, 48, align=left)]] '''ln''' steht für '''l'''i'''n'''k und erzeugt eine Verknüpfung zu einer Datei oder einem Verzeichnis. Man kann danach auf eine Datei nicht nur über ihren ursprünglichen Namen bzw. Pfad, sondern auch über den Namen des Links zugreifen. Dies ist zum Beispiel nützlich, wenn ein Programm eine bestimmte Programmbibliothek verlangt, die veraltet ist. Man kann nun einfach eine Verknüpfung mit dem Namen der veralteten Bibliothek auf die installierte Version setzen. Man unterscheidet zwischen Hardlinks und symbolischen (oder Soft-) Links, die zwar in etwa dasselbe bewirken, aber technisch völlig unterschiedlich realisiert sind. Symbolische Links - auch Verknüpfungen genannt - können nicht nur via Kommandozeile ([:Terminal:]), sondern mit diversen grafischen [:Dateimanager:Dateimanagern] erstellt werden. = Hardlinks = Ein Hardlink ist einfach ein Eintrag im Dateisystem mit einem Namen, der auf den tatsächlichen Speicherplatz einer Datei zeigt. Jede Datei hat immer mindestens einen Hardlink, denn ansonsten könnte man sie nicht ohne weiteres finden. Auch die Verzeichniseinträge '''.''' und '''..''' sind in Wirklichkeit Hardlinks, die auf das aktuelle bzw. das übergeordnete Verzeichnis zeigen. Ein Verzeichnis hat also immer mindestens zwei Hardlinks, nämlich den eigentlichen Namen und '''.''', und zusätzlich noch einen pro untergeordnetem Verzeichnis. (Je ein '''..''' pro Verzeichnis.) Für normale Operationen wie das Erstellen eines Verzeichnisses oder einer Datei benötigt man natürlich nicht den ln-Befehl. Dieser wird nur verwendet, um zusätzliche Links zu erzeugen. Wie viele Hardlinks aktuell auf eine Datei oder ein Verzeichnis zeigen, kann man der zweiten Spalte einer [:ls:`ls -l`]-Ausgabe entnehmen. Diese verschiedenen Links sind exakt gleichwertig und es ist völlig unerheblich, welcher zuerst da war. Änderungen an Inhalt oder Datei-Attributen wirken sich auf alle Links aus (weil es sich ja tatsächlich um dieselbe Datei handelt). Erst wenn alle Links auf eine Datei gelöscht wurden, ist die Datei wirklich gelöscht. Einen gravierenden Nachteil haben Hardlinks allerdings: Auf Grund der Technik, die dahinter steckt, ist es nicht möglich Hardlinks über die Grenzen von Dateisystemen hinweg einzusetzen. Um sich nicht immer Gedanken darüber machen zu müssen, ob das Ziel vielleicht auf einem anderen Dateisystem liegen könnte, werden deswegen fast ausschließlich "symbolische Verknüpfungen" genutzt. Das manuelle Erzeugen von Hardlinks auf Verzeichnisse ist sogar ganz verboten, um die Interpretation von '''..''' konsistent zu halten. = Symbolische Verknüpfungen = Symbolische Verknüpfungen ("Symlinks", "Softlinks" oder oft auch nur Verknüpfungen genannt) wurden geschaffen, um diese Unzulänglichkeit der Hardlinks zu umgehen. Sie funktionieren ähnlich wie die HTML-Links auf Webseiten. Ein symbolischer Link ist einfach eine kleine Datei bei der das l-Bit gesetzt ist, und die den Pfad der Zieldatei enthält. Dieser Pfad kann sowohl relativ ('''../anderes_verzeichnis/datei'''), als auch absolut ('''/usr/share/irgendwo/datei''') sein. In einer `ls -l` Auflistung wird das Ziel des Softlinks nach einem Pfeil (`->`) angezeigt. Symbolische Verknüpfungen sind, wie schon angedeutet, auch über Dateisystemgrenzen hinweg möglich, weswegen sie bevorzugt eingesetzt werden. Allerdings fehlt ihnen die direkte Verbindung zum tatsächlichen Speicherplatz der Zieldatei. Wird diese gelöscht, so bleibt die Verknüpfung als "toter Link" zurück und zeigt von nun an ins Leere. Dies kann auch beim Verschieben der Zieldatei passieren, vor allem bei Verwendung eines absoluten Pfades im Softlink. = Installation = Das Programm '''ln''' ist im essentiellen Paket {{{#!vorlage Paketinstallation coreutils }}} von Ubuntu enthalten und ist deshalb auf jedem System bereits installiert. = Anwendung = == grafische Oberfläche (für Softlinks) == Mit so gut wie allen grafischen [:Dateimanager:Dateimanagern] wie z.B. Nautilus, Dolphin, Caja, Thunar, etc. können Verknüpfungen via Kontextmenü ([[Vorlage(Tasten, rmb)]]) erstellt werden. Manchmal ist diese Funktion im Untermenü "Senden an -> Desktop / Arbeitsfläche usw." versteckt. Außerdem lassen sich Softlinks in den grafischen Dateimanagern durch Verschieben via Maus ([[Vorlage(Tasten, lmb)]]) mit gleichzeitig gedrückten Tasten [[Vorlage(Tasten, Shift)]] und [[Vorlage(Tasten, Strg)]] errichten. == Terminal == Die allgemeine Syntax lautet [1]: {{{#!vorlage Befehl ln [OPTION]... ZIEL [VERKNÜPFUNGSNAME] }}} oder um mehrere Dateien in ein Verzeichnis zu verlinken: {{{#!vorlage Befehl ln [OPTION]... ZIELE... LINKVERZEICHNIS }}} ln kennt folgende Optionen: {{{#!vorlage Tabelle <-2 rowclass="kopf" :> '''ln-Optionen''' +++ '''Option''' '''Beschreibung''' +++ ``-i`` oder ``--interactive`` fragt vor dem Überschreiben nach +++ ``-s`` oder ``--symbolic`` erzeugt eine symbolische Verknüpfung anstatt eines Hardlinks +++ ``-r`` oder ``--relative`` erzeugt - auch bei Angabe absoluter Pfade - eine Verknüpfung mit relativen Pfaden zueinander (setzt ``-s`` voraus) +++ ``-f`` oder ``--force`` vorhandene mit dem VERKNÜPFUNGSNAMEn gleichnamige Verknüpfungen oder auch Dateien überschreiben }}} {{{#!vorlage Hinweis Wenn bei Erstellung eines symbolischen Links der erste Parameter ein relativer Pfad ist, wird ein Softlink mit relativem Pfad erstellt (auch wenn die Option ``-r`` nicht verwendet wird). Der angegebene relative Pfad wird für den Softlink direkt verwendet und somit relativ zum zweiten Parameter (dem Link) interpretiert. Der Ort an dem man sich gerade befindet ist für den Softlink somit grundsätzlich bedeutungslos. Einzig der Speicherort des Softlinks (zweiter Parameter) wird bei Angabe eines relativen Pfades durch den aktuellen Ort beeinflusst. }}} = Beispiele = == Beispiele für Hardlinks == Mit diesem Befehl können Hardlinks für den Inhalt ganzer Verzeichnisse erstellt werden. Eventuell enthaltene Ordner werden dabei neu angelegt und die Dateien hart verlinkt: {{{#!vorlage Befehl cp -al QUELLE ZIEL }}} Siehe auch weiter unten [#Kopieren-cp Kopieren] == Beispiele für Softlinks == Im folgenden Beispiel wird eine Verknüpfung auf dem Desktop ('''Verknüpfung_mit_Tagesplaner''') zu einer Datei mit dem Namen '''haupt.odt''' im Homeverzeichnis des Benutzers `BENUTZER` erstellt: {{{#!vorlage Befehl ln -s /home/BENUTZER/Dokumente/Tagesplaner/Aufgaben/haupt.odt /home/BENUTZER/Arbeitsfläche/Verknüpfung_mit_Tagesplaner }}} Weitere Beispiele zur praktischen Verwendung finden sich im Artikel [:opt:]. = Verknüpfungen löschen = Verknüpfungen, egal welcher Art, kann man identisch zu jeder anderen Datei * in einer Konsole mit dem Befehl [:rm:] oder * mit einem beliebigen [:Dateimanager:] löschen. = Verknüpfungen finden = == Hardlinks finden == Mit folgendem Befehl kann man sowohl die Anzahl als auch die Orte der Hardlinks einer '''DATEI''' ausgeben. Ist die ausgegebene Hardlinks-Anzahl größer als die ausgegebenen Orte, so existieren weitere Hardlinks außerhalb vom '''STARTPUNKT''': {{{#!vorlage Befehl find STARTPUNKT -xdev -samefile DATEI -printf '%n %p\n' }}} Um alle Hardlinks, optional gefiltert mit '''TEST''', ab einem '''STARTPUNKT''' zu finden, verwendet man (dabei werden in der ersten Spalte zusätzlich die Nummern der zugehörigen [wikipedia:Inode:Inodes] ausgegeben): {{{#!vorlage Befehl find STARTPUNKT -xdev [TEST] -printf '%i %n %p\n' | fgrep -f <(find . -xdev -printf '%i\n' | sort -n | uniq -d) | sort -n }}} == Softlinks finden == Um Verknüpfungen rekursiv im '''VERZEICHNIS''' aufzuspüren bietet sich folgender Befehl an: {{{#!vorlage Befehl find VERZEICHNIS -type l }}} Des Weiteren kann man mittels ``ls`` sich das Ziel der Verknüpfung anzeigen lassen: {{{#!vorlage Befehl ls -l VERZEICHNIS/VERKNÜPFUNGSNAME }}} {{{#!vorlage Hinweis Bei Verknüpfungen mit Ordnern gilt das gleiche, wobei darauf zu achten ist keinen abschließenden '''/''' zu verwenden, da sonst der Verknüpfung gefolgt wird. }}} === Tote Softlinks === Folgender Befehl sucht im aktuellen Verzeichnis ('''.''') und dessen Unterverzeichnissen nach fehlerhaften Verknüpfungen: {{{#!vorlage Befehl find . -xtype l }}} === symlinks === Einfacher kann man Verknüpfungen mit dem Programm [:symlinks:] finden und auch teilweise bearbeiten. = Alternativen = == Kopieren (cp) == Die gleiche Funktionalität wie `ln` hat auch der Befehl [:cp:`cp`] in Verbindung mit den Optionen `-l` (Hardlink) oder `-s` (Softlink). Sollten Ordner oder Unterordner bei zu erstellenden Hardlinks enthalten sein, werden diese - exklusive Inhalt natürlich - tatsächlich kopiert. == Einbinden (mount --bind) == Eine weitere – allerdings eher selten genutzte – Möglichkeit, Daten an mehreren Orten im Dateisystem erscheinen zu lassen, bietet der Befehl [:mount#Einzelne-Ordner-einbinden:mount]. Nach dem Befehl: {{{#!vorlage Befehl mount --bind /PFAD/VERZEICHNIS1 /PFAD/VERZEICHNIS2 }}} (wobei beide Verzeichnisse tatsächlich existieren müssen) erscheint bis zum nächsten Systemstart der Inhalt von '''VERZEICHNIS1''' auch unter '''VERZEICHNIS2'''. Details sind der [:man:Manpage] von bind zu entnehmen. Soll diese Lösung auch nach einem Neustart des Systems bestehen bleiben bzw. automatisch beim Systemstart wieder angewandt werden, bietet sich eine Automatisierung des Einbindens mittels [:fstab:] oder [:systemd/Mount_Units:Systemd Mount-Unit] an. = Links = * [https://schinagl.priv.at/nt/hardlinkshellext/hardlinkshellext.html Link Shell Extension] {en} - NTFS-Links unter Windows erstellen * [https://www.gnu.org/software/coreutils/ GNU Core Utilities] {en} * [:Shell/Befehlsübersicht:] {Übersicht} Übersicht über verschiedene Shell-Befehle # tag: Shell