- Как найти и удалить битые символические ссылки в Linux
- Поиск и удаление символических ссылок
- Поиск и удаление битых символьных ссылок в Linux
- Символьные ссылки
- Создание символьных ссылок
- Битые символьные ссылки
- Поиск битых символьных ссылок (команда find)
- Анализ битых символьных ссылок
- Удаление битых символьных ссылок
- Утилита symlinks
- Заключение
Как найти и удалить битые символические ссылки в Linux
Символические ссылки, еще называемые мягкими, существуют не только в Windows, но и в Linux. По сути, символическая ссылка в Linux представляет собой файл, который ссылается на другой файл (в Linux вообще все объекты являются файлами) . Если файл будет удален, перемещен или переименован, указывающая на него символическая ссылка останется на диске, равно как и удаление символической ссылки не приведет к удалению файла.
В этом есть своя польза, например, по символической ссылке можно определить, где раньше располагался тот ли иной файл. С другой стороны, какой смысл держать на диске битые символьные ссылки, пусть даже и занимающие более чем скромное место?
Не будет ли лучшим их удалить? Особой трудности в Linux это не представляет, в той же Ubuntu символические ссылки легко идентифицируются по фиолетовому значку со стрелкой,
если же ссылка битая, то на нее «накладывается» еще один значок — крестик в красном кружке.
В терминале рабочие симлинки отличаются тем, что имеют бирюзовый цвет, кроме того, после названий мягких ссылок следуют стрелка и имя объекта, на который они ссылаются.
Если ссылка битая, ее название и название объекта, на который она ссылается, будут иметь красный цвет.
Поиск и удаление символических ссылок
Для поиска мягких ссылок в Linux очень удобно использовать команду find, точнее find . -type l , выводящую их список в текущем каталоге и всех вложенных в него папках.
При этом команда с данным набором параметров не различает рабочие и нерабочие ссылки, чтобы получить список только битых ссылок, вместо параметра type нужно использовать параметр -xtype, вот так:
find . -xtype l
Этот способ хорош для поиска битых символических ссылок в домашнем каталоге, в котором вы имеете доступ ко всем файлам, однако, если вы захотите вывести список нерабочих мягких ссылок в корневом каталоге, то вместе с битыми ссылками получите массу ошибок доступа к файлам и папкам, на которые у вас нет разрешений.
SUDO здесь не поможет, решить эту проблему можно сбросив все ошибки в /dev/null .
Добавьте к уже известной команде перенаправление:
find . -xtype l 2>/dev/null
Поскольку символические ссылки занимают очень мало места, их можно вообще не трогать.
Если всё же хотите их удалить, добавьте чрез пробел к указанной выше команде аргумент -delete.
Следует, однако, учитывать, что в некоторых случаях символические ссылки могут использоваться не по прямому назначению, например, как индикатор блокировки файла.
Когда вы вбиваете в Google запрос и поисковая система выдает вам список результатов, при клике .
В Windows 10 21286 Microsoft добавила на панель задач новый виджет «Новости и интересы». Если .
Любители скачивать из интернета всё подряд во время плановой оптимизации системы нередко обнаруживают у себя .
Часто ли вы обращаете внимание на URL-адрес, по которому собрались переходить? Скорее всего, что нечасто, .
Источник
Поиск и удаление битых символьных ссылок в Linux
Обновл. 14 Сен 2021 |
На этом уроке мы рассмотрим, как найти битые (т.е. неработающие) символьные ссылки, проанализировать их и удалить из Linux-системы, если это необходимо.
Символьные ссылки
Символьные ссылки (или «мягкие ссылки», «симлинки») представляют собой некое подобие ярлыков, которые могут указывать на файлы и каталоги. В окне файлового менеджера (или в консоле терминала) символьная ссылка выглядит так же, как и обычный файл или каталог. Файл или каталог, на который указывает символьная ссылка, может находиться в любом месте файловой системы.
Предположим, например, что в вашем домашнем каталоге под названием user есть символьная ссылка, указывающая на файл под названием text-file.txt, который находится где-то в другом месте файловой системы. Команды, которые вы применяете к символьной ссылке, автоматически применяются и к файлу, на который она ссылается, т.е. если вы попытаетесь использовать команду cat или less вместе с символьной ссылкой, то увидите содержимое файла text-file.txt.
Linux содержит большое количество символьных ссылок. Установщики приложений часто используют символьные ссылки для создания связей с исполняемыми файлами. При обновлении программного обеспечения, бинарный файл заменяется новой версией, и все символьные ссылки продолжают работать как и раньше до тех пор, пока имя нового файла совпадает со старым.
Мы можем легко увидеть некоторые символьные ссылки, применив к корневому каталогу команду ls . На тестовой машине с Debian 11 они выделены бледно-зеленым цветом:
Мы можем рассмотреть их подробнее, добавив опцию -l (long listing):
В начале каждой строки стоит буква l (link), которая обозначает, что данный объект является символьной ссылкой. Часть после -> показывает объект, на который указывает ссылка. В нашем примере целевыми объектами являются каталоги.
В символьных ссылках не используются права доступа к файлу (иными словами, они всегда имеют форму rwxrwxrwx ). В реальности, права доступа к символьным ссылкам определяются правами доступа к тому файлу, на который указывает символьная ссылка.
Создание символьных ссылок
Прежде, чем создавать символьную ссылку, предлагаю написать небольшую программку, которую мы свяжем с нашей ссылкой.
Для этого открываем терминал (например, с помощью сочетания клавиш Ctrl+Alt+T) и создаем новый файл ravesli.cpp:
Затем открываем этот файл любым текстовым редактором, например, nano:
Добавляем следующий код:
Нажимаем Ctrl+O для сохранения изменений и Ctrl+X для выхода из редактора.
Скомпилируем нашу программу при помощи компилятора g++:
g++ ravesli.cpp -o ravesli
Теперь переместим скомпилированный файл нашей программы к другим бинарным файлам в каталог /bin:
sudo mv ravesli /bin
Осталось создать символьную ссылку и связать её с /bin/ravesli. Для этого вводим команду ln (link) вместе с параметром -s (symbolic) и целевым объектом ( /bin/ravesli) с названием ссылки ( hello ):
ln –s /bin/ravesli hello
Мы только что связали бинарный файл с символьной ссылкой.
Битые символьные ссылки
Символьная ссылка становится битой (или «висячей»), если связанный с ней файл удаляется или перемещается в другое место. Если кто-то вручную удалит файл, не зная, что на него указывают символьные ссылки, то эти символьные ссылки больше не будут работать. Они будут похожи на дорожные знаки, указывающие на город, который снесли бульдозерами.
Для наглядной демонстрации такого поведения я специально создал символьную ссылку hello в каталоге
Видно, что ссылка указывает на программу под названием ravesli в каталоге /bin. Если мы запустим символьную ссылку, то запустится связанная с ней программа:
Далее обратимся к программе напрямую:
Как и ожидалось, мы получили тот же результат. А теперь давайте удалим файл программы:
sudo rm /bin/ravesli
Цвет символьной ссылки изменился. Она выделена красным, потому что Linux знает, что ссылка — битая. При этом система продолжает отображать объект, на который указывала ссылка, чтобы мы могли заменить файл, перекомпилировать программу или сделать другие, необходимые для восстановления символьной ссылки действия.
Обратите внимание, что если мы снова попытаемся запустить символьную ссылку, то получим ошибку ссылки, а не объекта, на который указывает ссылка:
Поиск битых символьных ссылок (команда find)
В большинстве современных версий команды find есть опция -xtype , которая упрощает поиск битых символьных ссылок. Использование команды find с опцией -xtype и флагом l (link) позволит искать и возвращать битые ссылки:
Стоит отметить, что по умолчанию поиск является рекурсивным, поэтому он автоматически выполняется для всех подкаталогов.
Если мы соединим вышеприведенную команду с командой wc -l (lines), то сможем подсчитать строки, что аналогично подсчету битых символьных ссылок:
find . -xtype l | wc -l
Как вы можете видеть, у нас есть 1 битая символьная ссылка.
Анализ битых символьных ссылок
Прежде чем удалять все битые символьные ссылки, внимательно изучите результаты команды find . Подумайте, есть ли веская причина для какой-либо из найденных символьных ссылок быть битой.
Иногда проблема может заключаться в символьной ссылке, а не в целевом файле: если символьная ссылка была создана неправильно, то она может ни на что не указывать, но при этом целевой файл существует. В таком случае пересоздание символьной ссылки станет решением проблемы.
Также возможно, что явно битая символьная ссылка используется в качестве чего-то другого, например, индикатора блокировки. Или что цель присутствует только периодически, и это ожидаемое (и желаемое) поведение конкретного программного обеспечения. Возможно, целевой файл копируется с другой машины или облака, выполняет свою функцию, а затем снова удаляется, только для того, чтобы быть замененным другой программой в следующем цикле.
Битая символьная ссылка может быть признаком неудачной установки программного обеспечения. В этом случае вместо удаления символьной ссылки вам следует либо исправить её вручную, либо повторить установку. Когда вы исправите необходимые битые ссылки, то повторите команду поиска битых ссылок. Если всё сделано правильно, исправленные символьные ссылки не должны будут больше отображаться в результатах поиска.
В целях безопасности лучше проводить удаление символьных ссылок в рамках ваших собственных каталогов. Будьте крайне осторожны при выполнении этих команд от имени root или в системных каталогах.
Удаление битых символьных ссылок
Опция -exec (execute) запускает некоторую команду, которая будет выполняться на результатах поиска, полученных от команды find . Мы собираемся использовать команду rm для удаления каждой поврежденной символьной ссылки. Часть <> заменяется именем битой символьной ссылки по мере обнаружения каждой из них с помощью команды find .
Мы должны использовать точку с запятой ( ; ), чтобы завершить список команд, которые мы хотим запустить при помощи -exec . Обратная косая черта ( \ ) используется для экранирования точки с запятой, благодаря чему она будет рассматривается как часть команды find :
find . -xtype l -exec rm <> \;
Как вы можете видеть, команда была выполнена без каких-либо признаков того, что что-то произошло. Чтобы убедиться, что битые ссылки удалены, мы повторяем команду для их поиска:
Нет никаких совпадающих результатов, что означает, что битые символьные ссылки были удалены.
Утилита symlinks
symlinks — это мощная утилита для управления и исправления битых символьных ссылок. Поскольку symlinks не входит в стандартную поставку большинства дистрибутивов Linux, то вам придется установить данный инструмент вручную.
Команда установки данной утилиты (в Debian 11) будет выглядеть следующим образом:
sudo aptitude install symlinks
Примечание: Если вы используете Ubuntu, то перед установкой symlinks вам нужно будет добавить репозиторий universe в список репозиториев вашей системы:
sudo add-apt-repository universe
После успешной установки symlinks вам необходимо проверить наличие битых ссылок в вашей системе. Для этого введите следующее:
Если в вашей системе присутствует битая (dangling) ссылка, вы получите вывод, который выглядит как на вышеприведенном скриншоте.
Символ . (точка) обозначает текущий рабочий каталог. Если вы хотите получить информацию о битых символьных ссылках, например, в каталоге /home, то можете сделать это, введя следующую команду:
Если в вашей системе присутствует битая ссылка, вы получите примерно следующий результат:
dangling: /home/diego/Документы/hello -> /bin/ravesli
Чтобы быстро удалить полученную ранее битую символьную ссылку, вы можете использовать флаг -d (delete):
Чтобы удалить битые символьные ссылки в каталоге /home, введите:
symlinks -d /home
На этот раз вывод будет не только перечислять найденные битые ссылки, но также сообщать, что ссылка теперь удалена, например:
dangling: /home/diego/Документы/hello -> /bin/ravesli
deleted: /home/diego/Документы/hello -> /bin/ravesli
Чтобы произвести рекурсивный поиск и удаление битых символьных ссылок в заданном каталоге, используйте флаги -dr (d = delete, r = recursive):
Заключение
Символьные ссылки важны для Linux, поскольку они облегчают процесс определения путей и управления ими на вашем компьютере. Но если об этом не позаботиться, то битые символьные ссылки могут занять огромный кусок вашего системного хранилища, и вы даже не узнаете об этом. В таких ситуациях в игру вступают такие утилиты, как symlinks и команда find . Также старайтесь всегда уделять время просмотру списка символьных ссылок, прежде чем запускать команду для их удаления.
Поделиться в социальных сетях:
Источник