Як знайти та видалити зламані символічні посилання в Linux

Символічні посилання в операційній системі Linux є дуже зручною функцією, проте з часом вони можуть “зламатися” та перестати вказувати на існуючі файли чи директорії. У цій статті розглянемо способи виявлення непрацюючих символічних посилань, їх аналізу та видалення з системи, якщо це необхідно.

Що таке символічні посилання?

Символічні посилання, які часто називають “м’якими” або “симлінки”, є своєрідними ярликами, що вказують на певні файли або каталоги. Візуально в файловому менеджері або при перегляді файлової структури через термінал, вони виглядають так само, як звичайні об’єкти. Символічне посилання може вказувати на об’єкт, розташований у будь-якій точці файлової системи.

Наприклад, уявімо, що у вашому домашньому каталозі є символічне посилання “мій_файл”, яке посилається на файл “важливий_документ.txt”, розташований в іншому місці. При зверненні до “мій_файл” команди автоматично виконуються з файлом, на який він вказує. Тобто, якщо ви спробуєте переглянути вміст “мій_файл” за допомогою команди `cat` або `less`, ви насправді побачите вміст “важливий_документ.txt”.

Стандартна конфігурація Linux містить велику кількість символічних посилань. Навіть якщо ви самі їх не створюєте, операційна система активно їх використовує. Під час встановлення програмного забезпечення часто застосовуються символічні посилання для вказівки на виконувані файли. При оновленні програми, двійковий файл замінюється на нову версію, і всі символічні посилання продовжують працювати без змін, за умови, що ім’я нового файлу збігається зі старим.

Для прикладу, можна легко переглянути деякі символічні посилання, використовуючи команду `ls` у кореневому каталозі. Символічні посилання зазвичай відображаються іншим кольором (наприклад, світло-блакитним в Ubuntu 20.10).

ls /

Для отримання більш детальної інформації, можна скористатися опцією `-l` (довгий список). Наприклад, переглянемо всі записи, що починаються з “lib”, та один запис “bin”:

ls -l /lib* /bin

Символ `l` на початку кожного рядка вказує на те, що елемент є символічним посиланням. Текст після стрілки `->` показує, на який об’єкт посилається символічне посилання. У наведеному прикладі всі цільові об’єкти є директоріями.

Зверніть увагу, що дозволи на читання, запис і виконання для власника, групи та інших користувачів в цьому списку є віртуальними. Вони не відображають реальних дозволів на об’єкт, на який вказує посилання. Файлова система враховує дозволи цільового файлу або каталогу.

Коли символічні посилання ламаються?

Символічне посилання вважається “зламаним” або “висячим”, якщо файл, на який воно вказує, було видалено або переміщено в інше місце. Це часто трапляється внаслідок некоректного видалення програмного забезпечення або переривання процесу деінсталяції. Якщо хтось видаляє файл вручну, не знаючи про наявні символічні посилання, вони також перестають працювати.

Для ілюстрації, розглянемо приклад з символічним посиланням “приклад” у поточному каталозі, яке вказує на програму “моя_програма” в директорії “bin”. Якщо ми “запустимо” посилання “приклад”, фактично запуститься програма “моя_програма”.

./приклад

Для перевірки, ми можемо запустити програму безпосередньо:

../bin/моя_програма

Тепер, якщо ми видалимо файл “моя_програма”:

rm ../bin/моя_програма

Символічне посилання “приклад” стає недійсним. У терміналі воно може відображатися червоним кольором, сигналізуючи про проблему. Linux також показує, на який об’єкт посилалося посилання, що дозволяє нам замінити файл, перекомпілювати програму або вжити інших заходів для відновлення.

Якщо спробувати запустити “зламане” посилання “приклад”, то помилка буде стосуватися самого посилання, а не об’єкта, на який воно вказувало.

./приклад

Пошук непрацюючих символічних посилань

Більшість сучасних версій команди `find` мають опцію `-xtype` (розширений тип), яка спрощує пошук “зламаних” символічних посилань. Для цього використовується прапорець `l` з `-xtype`. Команда `find` без додаткових параметрів виведе список непрацюючих посилань.

find . -xtype l

Запуск цієї команди в домашньому каталозі покаже список всіх “зламаних” символічних посилань. Команда `find` є рекурсивною, тому вона перевіряє всі підкаталоги автоматично.

Для прикладу, у нашому списку присутнє посилання “приклад”, яке ми навмисно “зламали”, а також інші посилання, пов’язані з браузером Firefox та знімками.

Щоб підрахувати кількість непрацюючих посилань, можна перенаправити вивід команди `find` до команди `wc -l` (підрахунок рядків).

find . -xtype l | wc -l

В даному випадку ми отримаємо повідомлення про наявність 24 недійсних посилань.

Аналіз та видалення непрацюючих посилань

Перш ніж видаляти пошкоджені символічні посилання, уважно перегляньте результати виконання команди `find`. Можливо, деякі з цих посилань є необхідними. Іноді проблема може полягати в самому посиланні, а не в цільовому файлі. У такому випадку, потрібно просто перестворити посилання, якщо цільовий файл існує.

Також можливо, що “зламане” посилання використовується в інших цілях, наприклад, як індикатор блокування файлу, що часто зустрічається у випадку з браузером Firefox. Важливо розуміти контекст використання символічних посилань перед їх видаленням.

Пошкоджене символічне посилання може також бути ознакою невдалого встановлення програми. У таких ситуаціях, замість видалення посилання, варто виправити помилку або повторити встановлення програмного забезпечення.

Після виправлення або відновлення необхідних посилань, повторіть пошук. Повині зникнути виправлені посилання зі списку.

Задля безпеки, краще обмежити видалення символічних посилань в межах ваших власних каталогів. Будьте обережні, запускаючи ці команди з правами суперкористувача (root) або в системних каталогах.

Видалення зламаних посилань

Для видалення непрацюючих символічних посилань можна використовувати параметр `-exec` з командою `rm`. Рядок `{}` буде замінено на назву кожного посилання, виявленого командою `find`. Для завершення списку команд, використовується крапка з комою `;`. Зворотний слеш `\` використовується для екранування крапки з комою, щоб вона розглядалася як частина команди `find`, а не як спеціальний символ Bash.

find . -xtype l -exec rm {} \; 

Після виконання команди, ви повернетеся до командного рядка без жодних повідомлень. Щоб переконатися, що недійсні посилання видалено, знову виконайте команду для їх пошуку:

find . -xtype l

Якщо результати порожні, це означає, що непрацюючі символічні посилання були успішно видалені.

Перевірка перед видаленням

Завжди виділяйте час для перегляду списку символічних посилань перед їх видаленням. Це дозволить уникнути випадкового видалення важливих посилань. Для більшої безпеки можна видаляти посилання в окремих каталогах. Наприклад, ви можете спочатку видалити посилання в каталозі “.snap”, а потім видалити вручну посилання “приклад”. Це дозволить зберегти посилання Firefox.