296 votes

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 '!' n'est pas présent, il ne se déclenche jamais. Et si '!' est présent, il se déclenche à chaque fois.

2 votes

Pour ce que ça vaut, si vous utilisez [[ ! -D $mda ]], ça marche très bien

427voto

drysdam Points 3266

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

Selon le Page de manuel GNU , -h est identique à -L mais selon le Page de manuel BSD il ne doit pas être utilisé :

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

2 votes

Je cherche à savoir si un lien symbolique N'EXISTE PAS. !-h ou !-L devrait fonctionner pour les liens symboliques, !-e devrait fonctionner autrement.

57 votes

Pour aider quiconque trouve ceci via Google comme je l'ai fait, la syntaxe complète est la suivante ! est if ! [ -L $mda ]; then .... fi c'est-à-dire mettre le point d'exclamation à l'extérieur de les crochets.

30 votes

Je voulais juste ajouter un petit quelque chose à l'astuce donnée par @Sam ; lorsque vous effectuez ce genre d'opérations, assurez-vous de mettre votre nom de fichier entre guillemets, afin d'éviter les problèmes d'espaces. if [ ! -L "$mda" ]; then ... fi (note : if [ ! ... ] et if ! [ ... ] sont identiques :)

40voto

Corin Points 89

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

Si vous ne voulez pas tester si le fichier est un lien symbolique, mais simplement vérifier s'il existe quel que soit son type (fichier, répertoire, socket etc.), utilisez -e

Ainsi, si le fichier est réellement un fichier et pas seulement un lien symbolique, vous pouvez effectuer tous ces tests et obtenir un état de sortie dont la valeur indique la condition d'erreur. obtenir un état 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

17 votes

-e "${file}" échoue si le lien symbolique existe mais que sa cible n'existe pas.

2 votes

Même résultat que Flimm. Je suis sous OS X. Pour moi, -L et -h fonctionnent pour les liens symboliques, mais pas -e ou -f.

3 votes

@Flimm, donc si je veux juste tester si un nom de fichier est pris (que ce soit un fichier ou un lien symbolique sans cible existante) quelle est la meilleure façon de le faire ? apparemment -e ne fonctionne pas

18voto

Lynch Points 2534

C'est peut-être ce que vous cherchez. 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"

5voto

DigitalRoss Points 80400

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

Voir man test .

4voto

Andrew Lazarus Points 4364

Si vous testez l'existence d'un fichier, vous devez utiliser -e et non -L. -L teste l'existence d'un lien symbolique.

0 votes

Je cherche à savoir si un lien symbolique N'EXISTE PAS. !-h ou !-L devrait fonctionner pour les liens symboliques, !-e devrait fonctionner autrement.

3 votes

Ce que vous voulez n'est pas clair. Le fichier existe et n'est pas un lien symbolique ? Testez alors les deux -e et !-h .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X