Como posso verificar se um arquivo é um link simbólico para um diretório?

48

Eu posso verificar se um arquivo existe e é um link simbólico com -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 for um diretório com -d:

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

Mas como posso testar apenas links para diretórios?

Eu simulei todos os casos em uma pasta de teste:

/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'
    
por rubo77 21.10.2013 / 04:13

3 respostas

57

Basta combinar os dois testes com && :

if [[ -L "$file" && -d "$file" ]]
then
    echo "$file is a symlink to a directory"
fi
    
por 21.10.2013 / 04:57
5

Aqui está um único comando que listará recursivamente links simbólicos cujo destino é um diretório (começando no diretório atual):

find . -type l -xtype d

Referência: link

    
por 25.07.2016 / 20:53
1

Uma solução com find e usando uma função:

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
    
por 22.10.2013 / 07:18

Tags