Solution 1 :
Utilisez le -f
flag pour imprimer la version canonique. Par exemple :
readlink -f /root/Public/myothertextfile.txt
À partir de man readlink
:
-f, --canonicalize
canonicalize by following every symlink in every component of the given name recursively; all but the last component must exist
Solution 2 :
readlink est la commande que vous voulez. Vous devriez regarder la page de manuel de la commande. Parce que si vous voulez suivre une chaîne de liens symboliques vers le fichier réel, vous avez besoin du commutateur -e ou -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
Solution 3 :
Cela fonctionnera également :
ls -l /root/Public/myothertextfile.txt
mais readlink
serait préférable pour une utilisation dans un script plutôt que d'analyser ls
.
Solution 4 :
Si vous voulez afficher la source et la destination du lien, essayez stat -c%N files*
. Par exemple
$ stat -c%N /dev/fd/*
‘/dev/fd/0’ -> ‘/dev/pts/4’
‘/dev/fd/1’ -> ‘/dev/pts/4’
Ce n'est pas bon pour l'analyse (utilisez readlink
pour cela), mais il affiche le nom du lien et la destination, sans l'encombrement de ls -l
-c
peut s'écrire --format
et %N
signifie "nom de fichier entre guillemets avec déréférencement si lien symbolique".
Solution 5 :
Le readlink
est une bonne chose, mais spécifique à GNU et non multiplateforme. J'avais l'habitude d'écrire des scripts multiplateformes pour /bin/sh
, donc j'utiliserais quelque chose comme :
ls -l /root/Public/myothertextfile.txt | awk '{print $NF}'
ou :
ls -l /root/Public/myothertextfile.txt | awk -F"-> " '{print $2}'
mais ceux-ci doivent être testés sur différentes plates-formes. Je pense qu'ils fonctionneront, mais je ne suis pas sûr à 100 % pour ls
format de sortie.
Le résultat de ls
peut également être analysé dans bash
sans dépendre d'une commande externe comme awk
, sed
ou perl
.
Ce bash_realpath
fonction, résout la destination finale d'un lien (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}"
}