web-dev-qa-db-fra.com

Comment vérifier si un lien symbolique existe

J'essaie de vérifier si un lien symbolique existe dans bash. Voici ce que j'ai essayé.

mda=/usr/mda
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi


mda='/usr/mda'
if [ ! -L $mda ]; then
  echo "=> File doesn't exist"
fi

Cependant, cela ne fonctionne pas. Si '!' est laissé de côté, il ne déclenche jamais. Et si '!' est là, il se déclenche à chaque fois.

190
bear

-L renvoie true si le "fichier" existe et constitue un lien symbolique (le fichier lié peut exister ou non). Vous voulez -f (retourne vrai si le fichier existe et est un fichier normal) ou peut-être juste -e (retourne vrai si le fichier existe quel que soit le type).

Selon la page de manuel GN , -h est identique à -L, mais selon la page de manuel BSD , il ne doit pas être utilisé:

-h file True si le fichier existe et qu'il s'agit d'un lien symbolique. Cet opérateur est conservé pour des raisons de compatibilité avec les versions précédentes de ce programme. Ne comptez pas sur son existence; utilisez -L à la place.

295
drysdam

-L est le test pour le fichier existe et est aussi un lien symbolique

Si vous ne voulez pas tester le fichier comme étant un lien symbolique, mais juste pour voir s'il existe quel que soit son type (fichier, répertoire, socket, etc.), utilisez -e.

Donc, si le fichier est vraiment un fichier et pas seulement un lien symbolique, vous pouvez effectuer tous ces tests et obtenir un statut de sortie dont la valeur indique la condition d'erreur.

if [ ! \( -e "${file}" \) ]
then
     echo "%ERROR: file ${file} does not exist!" >&2
     exit 1
Elif [ ! \( -f "${file}" \) ]
then
     echo "%ERROR: ${file} is not a file!" >&2
     exit 2
Elif [ ! \( -r "${file}" \) ]
then
     echo "%ERROR: file ${file} is not readable!" >&2
     exit 3
Elif [ ! \( -s "${file}" \) ]
then
     echo "%ERROR: file ${file} is empty!" >&2
     exit 4
fi
37
Corin

Vous pouvez vérifier l'existence d'un lien symbolique et qu'il n'est pas rompu avec:

[ -L ${my_link} ] && [ -e ${my_link} ]

La solution complète est donc:

if [ -L ${my_link} ] ; then
   if [ -e ${my_link} ] ; then
      echo "Good link"
   else
      echo "Broken link"
   fi
Elif [ -e ${my_link} ] ; then
   echo "Not a link"
else
   echo "Missing"
fi
33
Chen Levy

Peut-être que c'est ce que vous recherchez. Pour vérifier si un fichier existe et n'est pas un lien.

Essayez cette commande:

file="/usr/mda" 
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"
14
Lynch

Que diriez-vous d'utiliser readlink?

# if symlink, readlink returns not empty string (the symlink target)
# if string is not empty, test exits w/ 0 (normal)
#
# if non symlink, readlink returns empty string
# if string is empty, test exits w/ 1 (error)
simlink? () {
  test "$(readlink "${1}")";
}

FILE=/usr/mda

if simlink? "${FILE}"; then
  echo $FILE is a symlink
else
  echo $FILE is not a symlink
fi
6
popedotninja

Le fichier est-il vraiment un lien symbolique? Sinon, le test d’existence habituel est -r ou -e.

Voir man test.

4
DigitalRoss
  1. d'abord, vous pouvez faire avec ce style:

    mda="/usr/mda"
    if [ ! -L "${mda}" ]; then
      echo "=> File doesn't exist"
    fi
    
  2. si vous voulez le faire dans un style plus avancé, vous pouvez l'écrire comme ci-dessous:

    #!/bin/bash
    mda="$1"
    if [ -e "$1" ]; then
        if [ ! -L "$1" ]
        then
            echo "you entry is not symlink"
        else
            echo "your entry is symlink"
        fi
    else
      echo "=> File doesn't exist"
    fi
    

le résultat ci-dessus est comme:

root@linux:~# ./sym.sh /etc/passwd
you entry is not symlink
root@linux:~# ./sym.sh /usr/mda 
your entry is symlink
root@linux:~# ./sym.sh 
=> File doesn't exist
3
Amin Shateri

Si vous testez l'existence d'un fichier, vous voulez -e not -L. -L recherche un lien symbolique.

3
Andrew Lazarus