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

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

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

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

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

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

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

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

ls /

ls / в окне терминала.

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

ls -l /lib* /bin

ls -l / lib * / bin в окне терминала.

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

  Как получить последнюю версию Wine на Linux Mint 19

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

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

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

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

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

ls -l

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

./hello

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

../bin/htg

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

rm ../bin/htg

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

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

  Как настроить док-станцию ​​Cairo на рабочий стол Linux

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

./hello

ls -l в окне терминала.

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

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

find . -xtype l

найти -xtype l в окне терминала.

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

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

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

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

find . -xtype l | wc -l

найти .  -xtype l |  wc -l в окне терминала.

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

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

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

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

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

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

  Black Ops III для Linux

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

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

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

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

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

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

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

find . -xtype l -exec rm {} ;

найти .  -xtype l -exec rm {};  в окне терминала.

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

find . -xtype l

найти .  -xtype l в окне терминала.

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

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

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

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