В этой статье расскажем, что такое символические или символьные ссылки, как их найти, зачем это делать, а также дадим три способа, как их удалить.
Что такое символическая ссылка в Linux
Символическая или символьная ссылка — симлинк, symbolic link, её называют также мягкой или softlink Линукс — это файл, содержащий в себе указание (то есть адрес в дереве каталогов) на другой файл, директорию, устройство или канал. В других операционных системах, например, в Windows, они называются ярлыками. Символические ссылки нужно отличать от жёстких ссылок или hard link в Linux. Для хардлинк из Linux в Windows аналогов нет.
Взаимосвязь между софтлинк, целевым ресурсом и директорией, в которой он лежит, похожа на доступ по ссылке в Google Документах: вы не можете увидеть все чужие документы, но спокойно открываете, комментируете или редактируете те документы, на которые вам дали ссылку и предоставили соответствующий допуск. Это очень удобно, если ресурс расположен в недоступной пользователю директории из-за ограничения прав: в пользовательскую папку можно добавить символьную ссылку на любой ресурс. Или если нужно обеспечить доступ сразу нескольким пользователям — в пользовательском каталоге каждого размещают свои символьные ссылки. Распространённый способ применения — создание линка на глубоко расположенный объект для облегчения доступа.
Для примера, иконки программ на рабочем столе, запускающие приложение, — это символические cсылки на глубоко вложенный файл, созданные, чтобы не проходить весь путь к нему при каждом запуске программы. Любые действия, которые пользователь производит со связанным объектом (чтение, редактирование, копирование, перезапись и другие) не влияют на символьную ссылку. Но через софтлинк невозможно удалить целевой объект, так как это действие повлияет на неё саму. Символьная ссылка может быть связана с другой символьной ссылкой, и далее по цепочке неограниченной длины. ОС в таком случае идёт по цепочке линков, пока не достигнет конечной цели.
Симлинк — это удобный и необходимый для нормального взаимодействия с системой механизм. Но в их использовании есть нюанс: при перемещении или удалении целевого объекта символическая ссылка на него не изменяется. Она не удаляется и будет указывать в пустоту, так как в удаляемом объекте нет о ней сведений, он «не знает» о ней.
В итоге если софтлинки не удаляются одновременно с целевым объектом, то система засоряется «забытыми» softlink.
Как убедиться, что перед вами символьная ссылка
Проверяем файл с помощью ls: в терминале вводим команду ls с флагом -l (символизирует симлинк) — пробел — адрес проверяемого файла:
ls -l <имя_файла_в_дереве_каталогов>
В результате увидим статус файла и, если это софтлинк, то конечную цель, на которую указывает символическая ссылка.
Ответ на запрос принимает вид:
l <имя_файла_в_дереве_каталогов> -> /адрес/связанного/объекта
Слева от стрелки — файл и его статус (символ «l» подтверждает, что это симлинк), справа — объект, на который он указывает.
Как удалить символьную ссылку в Linux
Внимание!
Не удаляйте объект без проверки.
Чтобы удалить софтлинк, в первую очередь убедитесь, что у вас есть права на запись для родительской папки.
Рассмотрим три метода их удаления. Это команды:
- rm
- unlink
- find -delete
Они не отправляют запрос на подтверждение действия, поэтому будьте внимательны при их использовании.
Удаление с помощью rm (remove)
Основные правила для синтаксиса те же, что и обычно:
1. Чтобы удалить одиночный линк, введите в терминале:
rm <имя_символьной_сcылки>
Команда не запрашивает подтверждение и не выводит результат действия.
2. Для удаления двух и более мягких сcылок введите их через пробел после rm:
rm <сим_линк_1> <сим_линк_2>
Этот способ подходит для удаления любого количества и любого сочетания типов файлов и папок. Рядом с мягкой ссылкой допустимо указать любой тип файла или директорию.
3. Чтобы система запросила подтверждение действия (это не происходит автоматически) добавляем к команде флаг -i:
rm -i <имя символической_ссылки>
Пример запроса на подтверждение:
rm: remove symbolic link 'имя_символической_ссылки'?
Соглашаемся, выбирая Yes: вводим Y и нажимаем «Ввод».
4. Даже если симлинк ссылается на каталог, её нельзя заканчивать символом «слеш»: команда вызовет ошибку:
rm <символьный_линк_на_папку/>
rm: cannot remove 'символьный_линк_на_папку/': Is a directory
5. Никогда не добавляйте флаги -f и -rf при удалении софтлинк. Эти параметры удаляют файлы и папки принудительно, даже защищённые от записи.
Если вы отдадите команду вида:
rm -f сим_линк_на_директорию/
то будет удалено содержимое связанной директории.
Удаление через unlink
Unlink — утилита, удаляющая один указанный файл, в нашем случае — символическую ссылку. Её синтаксис стандартный (команда — пробел — имя softlink):
unlink <имя_символического_линка>
Эта команда, как и предыдущая, заканчивается нулём и не выводит результат.
Не добавляйте косую черту в конце имени линка. Unlink не удаляет каталоги, и указание со слешем приведёт к ошибке.
Как найти и в дальнейшем удалить softlink
1. После удаления целевых связанных объектов символические ссылки становятся сломанными, нерабочими, но не удаляются и засоряют файловую систему. А иногда нужно удалить рабочие линки, так как они больше не используются. Чтобы найти их все в определённом каталоге, используют команду find с флагом -type l (буква l означает, что тип искомых файлов — софтлинк). После find указывают директорию поиска:
find /путь/к/дир -type l
Поиск будет вестись в указанном каталоге и его подкаталогах. Вывод результата принимает вид:
/путь/к/дир/сим_линк_1
/путь/к/дир/родительская_папка_1/сим_линк_2
/путь/к/дир/родительская_папка_1/дочерняя_папка_2/сим_линк_3
2. Чтобы найти битые симлинки, вместо -type l добавляют флаг -xtype l:
find /путь/к/дир -xtype l
3. Чтобы исключить вложенные папки из поиска, добавьте флаг -maxdepth 1, указывающий максимальную глубину поиска:
find /путь/к/каталогу -maxdepth 1 -type l
Значение «1» запрещает поиск в дочерних папках.
Вывод результата:
/путь/к/каталогу/cимлинк_1
/путь/к/каталогу/cимлинк_2
4. Все найденные на предыдущих этапах символические ссылки удаляют уже описанными методами unlink и rm, приписывая их к команде вручную. Эти способы хороши тем, что дают возможность проконтролировать их удаление: увидеть всю массу ссылок, выбрать ненужные и удалить их избирательно.
5. Если вы обнаружили, что find нашла только битые ссылки, то можно удалить их пакетно, повторив команду find с флагом -delete. Методом можно пользоваться и при первичном поиске, но только с флагом -xtype l или если вы уверены, что все символические ссылки по указанному адресу нерабочие:
find /путь/к/директории -xtype l -delete
Итоги
Удаление ненужных или сломанных линков освобождает ресурсы и очищает систему от ненужных элементов, но важна осторожность. Помним, что удаление функциями remove, unlink и find -delete необратимо, восстановить удалённые данные обычными способами будет невозможно. Unlink по умолчанию способна удалять защищённые от записи данные, remove также может делать это, но с помощью дополнительного параметра.