Come posso verificare se un file è un collegamento simbolico a una directory?


64

Posso verificare se esiste un file ed è un collegamento simbolico con -L

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

e se è una directory con -d:

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

Ma come posso verificare solo i collegamenti alle directory?


Ho simulato tutti i casi in una cartella di prova:

/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'

Risposte:


75

Basta unire i due test con &&:

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

1
Se si desidera controllare anche i file e le directory nascosti prima di questo:shopt -s dotglob
rubo77

2
[-L "$ file"] && [-d "$ file"] non è migliore? Qualcosa con portabilità tra le conchiglie iirc.
Lennart Rolland,

3
Il codice di esempio di OP di @Lennart utilizza [[e l'ho preso come punto di partenza logico. Una discussione sul merito di [vs [[è fuori portata per questa risposta (ma disponibile qui ).


1

Una soluzione con finde usando una funzione:

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

Usare finde un while readper questo è un po 'eccessivo ...
Camilo Martin

1
Trova è davvero utile se cerchi solo determinati file
rubo77
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.