Soluzione 1:
Usa il -f
flag per stampare la versione canonizzata. Ad esempio:
readlink -f /root/Public/myothertextfile.txt
Da man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Soluzione 2:
readlink è il comando che desideri. Dovresti guardare la pagina man per il comando. Perché se vuoi seguire una catena di collegamenti simbolici al file effettivo, allora hai bisogno dell'opzione -e o -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
Soluzione 3:
Funzionerà anche:
ls -l /root/Public/myothertextfile.txt
ma readlink
sarebbe preferito per l'uso in uno script piuttosto che nell'analisi di ls
.
Soluzione 4:
Se vuoi mostrare la fonte e la destinazione del collegamento, prova stat -c%N files*
. Ad esempio
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Non va bene per l'analisi (usa readlink
per quello), ma mostra il nome del collegamento e la destinazione, senza la confusione di ls -l
-c
può essere scritto --format
e %N
significa "nome file tra virgolette con dereferenza se collegamento simbolico".
Soluzione 5:
Il readlink
è una buona cosa, ma specifica per GNU e non multipiattaforma. Ero solito scrivere script multipiattaforma per /bin/sh
, quindi userei qualcosa come:
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
oppure:
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
ma questi devono essere testati su piattaforme diverse. Penso che funzioneranno, ma non sono sicuro al 100% per ls
formato di output.
Il risultato di ls
può anche essere analizzato all'interno di bash
senza dipendere da un comando esterno come awk
, sed
o perl
.
Questo bash_realpath
funzione, risolve la destinazione finale di un collegamento (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}"
}