¿Cómo verifico si un archivo es un enlace simbólico a un directorio?

64

Puedo verificar, si existe un archivo y es un enlace simbólico con -L

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

y si es un directorio con -d:

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

Pero, ¿cómo puedo probar solo los enlaces a directorios?


Simulé todos los casos en una carpeta de prueba:

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

Respuestas:

75

Simplemente combine las dos pruebas con &&:

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

fuente
1
Si desea comprobar también los archivos y directorios ocultos antes de esto:shopt -s dotglob
rubo77
2
¿No es [-L "$ archivo"] && [-d "$ archivo"] mejor? Algo con portabilidad entre proyectiles iirc.
Lennart Rolland
3
El código de ejemplo de @Lennart OP utiliza [[, y lo tomé como el punto de partida lógico. Una discusión sobre los méritos de [vs [[está fuera del alcance de esta respuesta (pero disponible aquí ).
1

Una solución con findy usando una función:

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
rubo77
fuente
Usar findy while readpara eso es un poco excesivo ...
Camilo Martin
1
Buscar es realmente útil si busca solo ciertos archivos
rubo77