143 votes

Trouver la cible d'un lien symbolique via la ligne de commande

Disons que je crée un lien symbolique :

ln -s /root/Public/mytextfile.txt /root/Public/myothertextfile.txt

existe-t-il un moyen de voir quelle est la cible de myothertextfile.txt utilise la ligne de commande ?

187voto

PEZ Points 133

Utilisez le -f pour imprimer la version canonisée. Par exemple :

readlink -f /root/Public/myothertextfile.txt

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

24voto

Kyle Brandt Points 81077

Readlink est la commande que vous voulez. Vous devriez consulter la page de manuel de cette commande. Parce que si vous voulez suivre une chaîne de liens symboliques jusqu'au fichier réel, alors 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

6voto

jason saldo Points 5036

Cela fonctionnera également :

ls -l /root/Public/myothertextfile.txt

pero readlink serait préférable pour l'utilisation dans un script plutôt que l'analyse syntaxique ls .

5voto

Rado Points 1999

Si vous voulez montrer 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’

Il n'est pas bon pour l'analyse syntaxique (utilisez la fonction readlink pour cela), mais il affiche le nom du lien et la destination, sans l'encombrement de la rubrique ls -l

-c peut s'écrire --format y %N signifie "nom de fichier cité avec déréférencement si lien symbolique".

3voto

El readlink est une bonne chose, mais spécifique à GNU et non multiplateforme. J'avais l'habitude d'écrire des scripts multiplateforme 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 plateformes. Je pense qu'ils vont fonctionner, mais je ne suis pas sûr à 100% pour ls format de sortie.

Le résultat de ls peut également être analysé dans le cadre de bash sans dépendre d'une commande externe comme awk , sed o perl .

Ce site bash_realpath permet de déterminer la destination finale d'un lien (linklinkfinal) :

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}"
}

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X