Как найти и удалить битые символические ссылки в Linux

5 февраля 2021 |

Как найти и удалить битые символические ссылки в Linux

A terminal window on a Linux laptop. Fatmawati Achmad Zaenuri / Shutterstock

Символические ссылки в Linux — фантастическая функция, но они могут стать сломанными и остаться ни на что не указывающими. Вот как найти неработающие символические ссылки, просмотреть их и при необходимости удалить их из системы.

Символические ссылки 101

Символьные ссылки, также называемые «программными ссылками» и «символическими ссылками», представляют собой форму ярлыков которые могут указывать на файлы и каталоги. Символическая ссылка выглядит так же, как обычный файл или каталог в окне файлового менеджера. Он также отображается как запись в списке файлов в окне терминала. Файл или каталог, на который указывает символическая ссылка, может находиться в любом месте дерева файловой системы.

Например, предположим, что у вас есть символическая ссылка в вашем домашнем каталоге под названием «dave-link», которая указывает на файл с именем « text-file.txt », расположенный где-то еще в дереве файловой системы. Команды, которые вы используете для символической ссылки, автоматически применяются к файлу, на который она указывает. Если вы попытаетесь использовать cat или less в символической ссылке, вы действительно увидите содержимое файла «text-file.txt».

Стандартная установка Linux содержит много символических ссылок. Даже если вы не создаете их самостоятельно, операционная система их использует. Процедуры установки приложений часто используют символические ссылки для указания на исполняемые файлы. Когда программное обеспечение обновляется, двоичный файл заменяется новой версией, и все символические ссылки продолжают работать, как и раньше, до тех пор, пока имя нового файла совпадает с именем старого.

Мы можем легко увидеть некоторые символические ссылки с помощью ls в корневом каталоге. Некоторые записи отображаются другим цветом — на нашей тестовой машине с Ubuntu 20.10 они отображаются голубым цветом.

Мы вводим следующее:

ls /

Мы можем взглянуть глубже, используя параметр -l (длинный список). Мы вводим следующую команду, чтобы просмотреть все записи «lib» и единственную запись «bin»:

ls -l / lib * / bin

На начало каждой строки — это «l», что указывает на то, что элемент является символической ссылкой. Текст после «- & gt» показывает, на что указывает символическая ссылка. В нашем примере целями являются все каталоги.

В списке разрешений указаны права на чтение, запись и выполнение для владельца, группы и других. Это поддельные записи по умолчанию. Они не отражают фактических разрешений на объекты, на которые указывают символические ссылки. Это права доступа к целевому файлу или каталогу, которые имеют приоритет и соблюдаются файловой системой.

Неработающие символические ссылки

Символическая ссылка не работает (или остается висящей), когда файл, на который она указывает, удаляется или перемещается в другой расположение. Если процедура удаления приложения не работает должным образом или прерывается до завершения, у вас могут остаться неработающие символические ссылки.

Если кто-то вручную удалит файл, не зная, что символические ссылки указывают на него, эти символические ссылки больше не будут Работа. Они будут похожи на дорожные знаки, указывающие на город, который был разрушен бульдозером.

Мы можем легко увидеть такое поведение, используя символическую ссылку «привет» в текущем каталоге. Мы вводим следующее, используя ls, чтобы увидеть это:

ls -l

Он указывает на программу с именем «htg» в каталоге с именем «bin». Если мы «запустим» символическую ссылку, она выполнит программу за нас:

./hello

Теперь мы можем проверить, происходит ли это, запустив программу напрямую:

../bin/htg

Как и ожидалось, получаем такой же ответ. Давайте удалим программный файл:

rm ../bin/htg

Теперь, когда мы смотрим на символическую ссылку, мы видим, что она выделена красным, потому что Linux знает, что она сломана. Он также сообщает нам, на что он указывал, поэтому мы можем заменить файл, перекомпилировать программу или сделать все необходимое для восстановления символической ссылки.

Обратите внимание, что если мы попытаемся запустить символическую ссылку, появится ошибка мы получаем ссылки на имя символической ссылки, а не на имя программы, на которую указывает символическая ссылка.

Мы вводим следующее:

./ hello

Поиск сломанных символических ссылок

Большинство современных версий find имеют параметр xtype (расширенный тип), который упрощает поиск неработающих символических ссылок. Мы будем использовать флаг l с xtype, чтобы указать ему искать ссылки. Использование find и xtype следующим образом, без каких-либо других флагов типа, заставляет xtype возвращать неработающие ссылки:

find. -xtype l

Выполнение команды в нашем тестовом домашнем каталоге обнаруживает довольно много неработающих символических ссылок. Обратите внимание, что поиск по умолчанию является рекурсивным, поэтому он автоматически ищет все подкаталоги.

Символическая ссылка «hello», которую мы специально разорвали, отображается, как мы и ожидали. Одна из других символических ссылок связана с браузером Firefox, а остальные связаны со снимками.

Если мы передаем вывод через wc с параметром -l (lines), мы можем подсчитать строки, что то же самое, что и подсчет неработающих символических ссылок.

Мы вводим следующее:

find.-xtype l | wc -l

Нам сообщили, что у нас есть 24 неработающих символических ссылки, ни на что не указывающих.

Найдите, просмотрите, а затем удалите

Перед тем, как спешить и удалите все битые символические ссылки, посмотрите результаты команды find. Проверьте, существует ли веская причина для неработающих символических ссылок.

Иногда проблема может быть в символической ссылке, а не в целевом файле. Если символическая ссылка была создана неправильно, она может ни на что не указывать, но настоящая цель присутствует. В этом случае исправлением будет воссоздание символической ссылки.

Также возможно, что явно неработающая символическая ссылка используется как что-то еще, например, индикатор блокировки файла или другой индикатор перехода / отказа. Firefox делает это, это первая символическая ссылка в нашем списке. Однако Firefox не используется на нашей тестовой машине, поэтому мы можем его удалить.

Также возможно, что цель присутствует только периодически, и это ожидаемое (и желаемое) поведение этого конкретного программного обеспечения. Возможно, целевой файл скопирован с другой машины или облака, он выполняет свою функцию, а затем снова удаляется, но в следующем цикле его заменяет другая программа.

Неисправная символическая ссылка также может быть признак неудачной установки программного обеспечения. В этом случае вместо удаления символической ссылки вы должны либо вручную исправить ее, либо повторить установку.

После исправления неработающих ссылок, которые необходимо сохранить, повторите команду для выполнения поиска. В этом случае фиксированные символические ссылки должны отсутствовать в результатах поиска.

В целях безопасности лучше всего ограничить удаление символических ссылок своими собственными каталогами. Будьте крайне осторожны, выполняя эти команды от имени пользователя root или в системных каталогах.

Удаление битых символических ссылок

Параметр -exec (выполнить) запускает команды для результатов поиска. Мы собираемся использовать rm для удаления каждой неработающей символической ссылки. Строка {} заменяется именем каждой неработающей символической ссылки, когда каждая из них обнаруживается с помощью find.

Мы должны использовать точку с запятой (,), чтобы завершить список команд, которые мы хотим запустить -exec. Мы будем использовать обратную косую черту (), чтобы «избежать» точки с запятой, поэтому она будет рассматриваться как часть команды find, а не как то, что Bash должен действовать.

Набираем следующее:

find. -xtype l -exec rm {},

Мы вернулись в командную строку без каких-либо указаний на то, что что-то произошло. Чтобы убедиться, что неработающие ссылки были удалены, мы повторяем команду для их поиска, а именно:

find. -xtype l

Нет подходящих результатов, что означает, что битые символические ссылки были удалены.

Не забудьте сначала просмотреть

Опять же, всегда находите время, чтобы просмотреть список символических ссылок, прежде чем запускать команду для их удаления. Вы можете избежать удаления тех, в которых вы не уверены, запустив команду для их удаления в соответствующих каталогах.

Например, выше, мы могли бы запустить команду в каталоге «.snap», а затем вручную удалена одиночная символическая ссылка «привет». Это оставило бы символическую ссылку блокировки Firefox нетронутой.

Как найти и удалить битые символические ссылки в Linux

Tags:

Напишите пару строк: