Как выловить все битые ссылки?

Случается, что необходимо найти все битые ссылки (т.е. ссылки которые указывают на файлы, которых уже не существует). Поможет простенькая коммандочка:
find /path -type l | while read link; do [ -e `readlink $link` ] || echo $link; done
здесь:
  • find /path -type l - ищем все ссылки в каталоге /path и передаем их по конвееру while'у
  • while read link - while'ом построчно читаем и засовываем в переменную link
  • readlink $link - читаем ссылку (т.е. куда она указывает)
  • [ -e `readlink $link` ] - проверяем результат выполнения readlink'а на существование
  • || echo $link - ИНАЧЕ файла, на который указывает ссылка, не существует - выводим его в stdout
Что делать потом с ними - решать вам! :) Можно удалить их:
find /path -type l | while read link; do [ -e `readlink $link` ] || echo $link; done|xargs rm -f
или
find /path -type l | while read link; do [ -e `readlink $link` ] || rm -f $link; done
Можно перенести их куда-нибудь:
find /path -type l | while read link; do [ -e `readlink $link` ] || mv $link /dest_path; done
И прочее-прочее! Все зависит от вашей фантазии! ;)