Lösung 1:
Verwenden Sie den -f
flag, um die kanonisierte Version zu drucken. Zum Beispiel:
readlink -f /root/Public/myothertextfile.txt
Ab man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Lösung 2:
readlink ist der gewünschte Befehl. Sie sollten sich die Manpage für den Befehl ansehen. Denn wenn Sie einer Kette von symbolischen Links zur eigentlichen Datei folgen wollen, dann brauchen Sie den Schalter -e oder -f:
$ ln -s foooooo zipzip # fooooo doesn't actually exist
$ ln -s zipzip zapzap
$ # Follows it, but doesn't let you know the file doesn't actually exist
$ readlink -f zapzap
/home/kbrandt/scrap/foooooo
$ # Follows it, but file not there
$ readlink -e zapzap
$ # Follows it, but just to the next symlink
$ readlink zapzap
zipzip
Lösung 3:
Das funktioniert auch:
ls -l /root/Public/myothertextfile.txt
aber readlink
würde für die Verwendung in einem Skript bevorzugt werden, anstatt ls
zu parsen .
Lösung 4:
Wenn Sie die Quelle und das Ziel des Links anzeigen möchten, versuchen Sie es mit stat -c%N files*
. Z. B.
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Es ist nicht gut zum Parsen (verwenden Sie readlink
dafür), aber es zeigt den Namen und das Ziel des Links, ohne das Durcheinander von ls -l
-c
kann --format
geschrieben werden und %N
bedeutet „Dateiname in Anführungszeichen mit Dereferenzierung bei symbolischem Link“.
Lösung 5:
Die readlink
ist eine gute Sache, aber GNU-spezifisch und nicht plattformübergreifend. Früher habe ich plattformübergreifende Skripte für /bin/sh
geschrieben , daher würde ich so etwas wie:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
oder:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
Diese müssen jedoch auf verschiedenen Plattformen getestet werden. Ich denke, sie werden funktionieren, bin mir aber bei ls
nicht 100 % sicher Ausgabeformat.
Das Ergebnis von ls
kann auch innerhalb von bash
geparst werden ohne Abhängigkeit von einem externen Befehl wie awk
, sed
oder perl
.
Diese bash_realpath
Funktion, löst das endgültige Ziel eines Links auf (link→link→link→final):
bash_realpath() {
# print the resolved path
# @params
# 1: the path to resolve
# @return
# >&1: the resolved link path
local path="${1}"
while [[ -L ${path} && "$(ls -l "${path}")" =~ -\>\ (.*) ]]
do
path="${BASH_REMATCH[1]}"
done
echo "${path}"
}