find -L -type l
находит неработающие символические ссылки.Сначала убедитесь, что файл не является каталогом или символической ссылкой на каталог с test -d
(если это каталог, find
вернется в него).Таким образом:
is_broken_symlink () {
case $1 in -*) set "./$1";; esac
! [ -d "$1" ] && [ -n "$(find -L "$1" -type l)" ]
}
Это склонно к гонке, если связь между вызовом на test
и вызовом на find
меняется.Альтернативный подход - сказать find
не повторять.
is_broken_symlink () {
case $1 in -*) set "./$1";; esac
[ -n "$(find -L "$1" -type l -print -o -prune)" ]
}