Freitag, 2. April 2021

Softlinks in Linux auflösen mit readlink

Ein Softlink in Linux wird mit 

ln -s linkziel linkname

erzeugt.

Dabei darf ein Link auf einen Ordner, eine Datei oder einen anderen Link verweisen.

Durch Letzteres gibt es die Situation, dass man von einem Dateipfad nicht sicher sein kann, dass alle Pfadbestandteile wirklich existieren.

Nehmen wir einen lokalen Pfad a/b/c/datei.txt an.

Dann kann jedes Element darin ein Softlink sein.

Um den echten Pfad aufzulösen gibt es den Linux Befehl readlink.

Ohne Optionen gibt es nur das Endziel des Softlinks nach Auflösung jedes Bestandteils des Pfades aus.

 Mit Option -e müssen alle Bestandteile des Pfades aufgelöst werden können.

Es wird dann der um Softlinks bereinigte vollständige Dateipfad ausgegeben.

Mit Option -f darf der letzte Bestandteil des aufgelösten Dateipfades nicht vorhanden sein; d.h.

Aus a/b/c/datei.txt wird z.B. /d/e/f/g/h/zieldatei.txt.
Dann muss der Pfad /d/e/f/g/h/ existieren und zieldatei.txt darf fehlen im Dateisystem.

 

Mit Option -m werden alle Pfadbestandteile soweit wie möglich aufgelöst und wenn dies nicht möglich so belassen und mit dem Restpfad konkateniert.

 

Fazit:

Nur die Variante mit Option -e macht Sinn.

 

Nachfolgend ein Beispiellauf mit letztem Softlink "mehrpfadig":

 noname@pb:~/todel/linktest$ ls -l
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 15:44 a
lrwxrwxrwx 1 noname noname    6 Apr  2 15:17 start -> a/lElb
noname@pb:~/todel/linktest$ ls -l a
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 15:58 b
lrwxrwxrwx 1 noname noname    1 Apr  2 15:44 lEb -> b
lrwxrwxrwx 1 noname noname    3 Apr  2 15:10 lElb -> lEb
lrwxrwxrwx 1 noname noname    2 Apr  2 15:08 lNb2 -> b2
noname@pb:~/todel/linktest$ ls -l a/b
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 13:05 c
-rw-r--r-- 1 noname noname    0 Apr  2 15:24 fba
lrwxrwxrwx 1 noname noname    3 Apr  2 15:09 lEb -> lEb
lrwxrwxrwx 1 noname noname   18 Apr  2 15:58 lNexisting -> blabla/tests/gsddg
noname@pb:~/todel/linktest$ readlink start/lNexisting
blabla/tests/gsddg
noname@pb:~/todel/linktest$ readlink -e start/lNexisting
noname@pb:~/todel/linktest$ readlink -f start/lNexisting
noname@pb:~/todel/linktest$ readlink -m start/lNexisting
/home/noname/todel/linktest/a/b/blabla/tests/gsddg

   

 Beispiellauf mit letztem Link "einpfadig":

noname@pb:~/todel/linktest$ ln -snf blabla a/b/lNexisting
noname@pb:~/todel/linktest$ ls -l
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 15:44 a
lrwxrwxrwx 1 noname noname    6 Apr  2 15:17 start -> a/lElb
noname@pb:~/todel/linktest$ ls -l a 
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 16:17 b
lrwxrwxrwx 1 noname noname    1 Apr  2 15:44 lEb -> b
lrwxrwxrwx 1 noname noname    3 Apr  2 15:10 lElb -> lEb
lrwxrwxrwx 1 noname noname    2 Apr  2 15:08 lNb2 -> b2
noname@pb:~/todel/linktest$ ls -l a/b
total 4
drwxr-xr-x 3 noname noname 4096 Apr  2 13:05 c
-rw-r--r-- 1 noname noname    0 Apr  2 15:24 fba
lrwxrwxrwx 1 noname noname    3 Apr  2 15:09 lEb -> lEb
lrwxrwxrwx 1 noname noname    6 Apr  2 16:17 lNexisting -> blabla
noname@pb:~/todel/linktest$ readlink start/lNexisting
blabla
noname@pb:~/todel/linktest$ readlink -e start/lNexisting
noname@pb:~/todel/linktest$ readlink -f start/lNexisting
/home/noname/todel/linktest/a/b/blabla
noname@pb:~/todel/linktest$ readlink -m start/lNexisting
/home/noname/todel/linktest/a/b/blabla

 

Keine Kommentare:

Kommentar veröffentlichen