Basta combinar os dois testes com &&
:
if [[ -L "$file" && -d "$file" ]]
then
echo "$file is a symlink to a directory"
fi
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'
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
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