ln


Oft will man Dateien unter einem anderen Namen ansprechen können, als den den sie haben. Dazu macht man einen sogenannten "Link" auf die Datei.
Das zugehörige Unix Kommando hat nach alter Tradition den 1. und den 3. Buchstaben dieses Wortes als Befehl: ln

Es gibt zwei Arten dieser Links "hardlink" und "symlink" ("symlinks" werden oft auch als "softlinks" oder "symbolic links" bezeichnet. die zugehörige Option bei ln heisst -s )

Aber zuerst zu den (an und für sich eher weniger gebräuchlichen) "hardlinks": Angenommen du hast eine Datei blabla.txt die du auch unter dem Namen blibli.txt ansprechen können willst:

ln blabla.txt blibli.txt

erzeugt jetzt diesen "hardlink". blabla.txt und blibli.txt sind jetzt zwei verschiedene Namen für das selbe File, d.h. wenn du das file blibli.txt editierst oder überschreibst dann ist auch das blabla.txt geändert. Die Zugriffsrechte auf die Datei sind auch immer identisch. Das einzige Verschiedene ist der Name. Die beiden Namen sind ansonsten völlig gleichwertig (es lässt sich nicht mehr entscheiden ob nun blabla.txt ein Link auf blibli.txt ist oder umgekehrt). Wenn du mit rm einen der beiden Namen löscht existiert das File noch weiter unter dem anderen Namen. Erst wenn der letzte Name eines Files entfernt wurde wird auch das File tatsächlich gelöscht. (Damit das funktioniert wird beim File gespeichert wieviele Links auf ein File zeigen. Wenn der Zähler auf 0 geht dann wird das File echt gelöscht)

also:

rm blabla.txt

cat blibli.txt ..... geht noch.

rm blibli.txt ......jetzt ist das file wirklich weg.

Solche "hardlinks" kannst du auch in andere Verzeichnisse legen. Also z.B.

ln arbeiten/bla.txt wichtig/bli.txt

"hardlinks" kann man aber nicht über verschiedenen Filesysteme hinweg legen. also:

ln /cdrom/README blabla.txt

funktioniert nicht, weil die Daten unterhalb von /cdrom i.a. in einem eigenen Filesystem liegen.

Man kann i.a. auch keine "hardlinks" auf Verzeichnisse machen.

Praktischer und viel öfter verwendet werden daher die symlinks:

ln -s blabla.txt blibli.txt

erzeugt einen "symlink" mit dem Namen blibli.txt der auf das file blabla.txt zeigt.

mit

ls -l *.txt

siehst du das auch. In der Ausgabe siehst du einen " -> " Pfeil, der besagt, dass es sich um einen Link handelt und wohin der zeigt.

Die Dateien sind jetzt nicht mehr völlig gleichwertig. blabla.txt ist das echte File und blibli.txt nur ein Verweis darauf. (d.h. wenn du blabla.txt löscht, dann existiert ein symlink der ins Leere zeigt. ("dangling symlink")

Du kannst "symlinks" auch über Filesystem-Grenzen hinweg legen und auch für ganze Verzeichnisse setzen. z.B.:

ln -s "/var/www/meine.domain/bilder/" meinewebfiles

würde das Windows Verzeichnis Bilder in deinem Homeverzeichnis als "meinewebfiles/" verlinken. Solche Links sind oft praktisch, weil man damit lange Pfadangaben für oft gebrauchte Files vermeiden kann.

mit dem "find" Kommando kann man auch nach "symlinks" suchen:

find /etc -type l

würde alle Files unterhalb von /etc finden die ein "symlink" sind.

Um "hardlinks" aufzuspüren kann man die "find" Option -link +n verwenden, die alle Files findet die mehr als n Links (in diesem falle "hardlinks") haben (gilt nicht für Verzeichnisse) .

find /usr -links +1 -type f

würde alle normalen Fles unterhalb von /usr finden deren Linkzähler grösser als 1 ist, also alle Namen von "hardlink" Files.
Wie findet man heraus welcher Name jetzt Link auf welches File ist?
mit

ls -i

sieht man zu jedem File eine Nummer die "inode Nummer" genannt wird. Das ist eine interne Repräsentation des Files. Dateien mit der selben "inode Nummer" sind "hardlinks" aufeinander.

find /usr -links +1 -type f -exec ls -i {} ; |sort

würde also eine Liste ausgeben, wo anhand der gleichen Nummern (nach dem "sort" stehen die untereinander) gut zu sehen ist, welches File ein "hardlink" auf ein anderes ist) noch eleganter:

find /usr -links +1 -type f -printf "%i %p " |sort -n

(%i beim -printf argument gibt die inode nummer aus so wie ls -i )

EXERCISES:


* Lege ein File an und mache einen oder mehrere "hardlinks" auf dieses File, eventuell auch aus verschiedenen Verzeichnissen heraus.

* Sieh dir mit dem ls -i die "inode Nummern" der Files an.

* Editiere eines der Files oder ändere mit "chmod" die Permissions. Ändern sich auch die anderen Files?

* Lösche einen oder mehrere der "hardlinks". Wann ist das File wirklich weg?

* Leg dir in deinem Homeverzeichnis einen "symlink" auf ein oft gebrauchtes File oder Verzeichnis an

* Wie sind die "symlinks" mit dem "ls" Kommando zu sehen?

* Welche Möglichkeiten bietet der "find" Befehl zum Aufspüren von "symlinks" und zum Aufspüren von "hardlinks"?


REFERENCES:

man ln

info ln

man find

info find

man ls