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


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'

Відповіді:


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 використовує [[, і я взяв це за логічну вихідну точку. Обговорення достоїнств [порівняно [[з цією відповіддю не вдається (але доступні тут ).


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

Використання findі while readдля цього є свого роду надмір ...
Каміло Мартін

1
Знайти дійсно корисно, якщо шукати лише певні файли
rubo77
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.