Comment vérifier si un fichier est un lien symbolique vers un répertoire?


64

Je peux vérifier si un fichier existe et est un lien symbolique avec -L

for file in *; do
    if [[ -L "$file" ]]; then echo "$file is a symlink"; else echo "$file is not a symlink"; fi
done

et si c'est un répertoire avec -d:

for file in *; do
    if [[ -d "$file" ]]; then echo "$file is a directory"; else echo "$file is a regular file"; fi
done

Mais comment puis-je tester uniquement les liens vers des répertoires?


J'ai simulé tous les cas dans un dossier de test:

/tmp/test# ls
a  b  c/  d@  e@  f@

/tmp/test# file *
a: ASCII text
b: ASCII text
c: directory
d: symbolic link to `c'
e: symbolic link to `a'
f: broken symbolic link to `nofile'

Réponses:


75

Il suffit de combiner les deux tests avec &&:

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi

1
Si vous voulez vérifier les fichiers cachés et les répertoires aussi, faites-le avant:shopt -s dotglob
— rubo77

2
[-L "$ file"] && [-d "$ file"] n'est-il pas meilleur? Quelque chose avec la portabilité entre les coquilles iirc.
— Lennart Rolland

3
L'exemple de code utilisé par @Lennart OP est utilisé [[comme point de départ logique. Une discussion sur les mérites de [vs [[est hors de portée pour cette réponse (mais disponible ici ).


1

Une solution avec findet en utilisant une fonction:

dosomething () {
    echo "doing something with $1"; 
}
find -L -path './*' -prune -type d| while read file; do 
    if [[ -L "$file" && -d "$file" ]];
        then dosomething "$file";
    fi; 
done

Utiliser findet while readpour ça, c'est un peu exagéré ...
— Camilo Martin

1
Find est vraiment utile si vous ne recherchez que certains fichiers
— rubo77
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.