Как вы поняли, ln
заменяет только симлинки. Чтобы исправить это, нужно, по крайней мере, переустановить пакеты, которые обеспечивают недостающие симлинки...
Использование опции find
-L
в сочетании с -type l
позволяет определить сломанные симлинки; затем dpkg -S
определит соответствующий пакет в большинстве случаев:
dpkg -S $(find -L /usr/bin -type l)
Фильтрация этих данных и передача их в apt-get
позволяет переустановить пакеты:
apt-get --reinstall install $(dpkg -S $(find -L /usr/bin -type l) | grep -v "diversion by" | cut -d: -f1)
Это все еще оставит несколько неработающих симлинков, в основном соответствующих альтернативам в /etc/alternatives
; их можно исправить, используя что-то вроде
for file in $(find -L /usr/bin -type l -printf "%f\n"); do \
if [ -e "/etc/alternatives/${file}" ]; then \
ln -sf "/etc/alternatives/${file}" "/usr/bin/${file}"; \
fi; \
done
(Вы, вероятно, захотите заменить ln -sf
на echo
, чтобы проверить, что будет сделано. ...)
(Я ранее предлагал использовать debsums
, но это не работает, потому что симлинки не хэшируются)