Как проверить, является ли файл символической ссылкой на каталог?

64

Я могу проверить, существует ли файл и является ли он символической ссылкой с -L

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

и если это каталог с -d:

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

Но как я могу проверить только ссылки на каталоги?


Я смоделировал все случаи в тестовой папке:

/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
источник

Ответы:

75

Просто объедините два теста с &&:

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

источник
1
Если вы хотите проверить скрытые файлы и каталоги, тоже предшествовали этому раньше:shopt -s dotglob
rubo77
2
Разве [-L "$ file"] && [-d "$ file"] лучше? Что-то с переносимостью между оболочками IIRC.
Леннарт Роллан
3
Пример кода @Lennart OP использует [[, и я принял это за логическую отправную точку. Обсуждение достоинств [vs [[выходит за рамки этого ответа (но доступно здесь ).
1

Решение с findиспользованием функции:

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
источник
Использование findи while readдля этого является своего рода излишним ...
Камило Мартин
1
Найти действительно полезно, если вы ищете только определенные файлы
rubo77