Я настійно пропоную не використовувати find -L
для завдання (пояснення див. Нижче). Ось кілька інших способів зробити це:
Якщо ви хочете використовувати "чистий find
" метод, він повинен виглядати так:
find . -xtype l
( xtype
це тест, виконаний за відміненою посиланням). Однак це може бути доступне не у всіх версіях find
. Але є й інші варіанти:
Ви також можете виконати test -e
з find
команди:
find . -type l ! -exec test -e {} \; -print
Навіть якась grep
хитрість може бути кращою (тобто, більш безпечною ), ніж find -L
, але не зовсім такою, як це представлено у запитанні (яка відображається у всіх вихідних рядках, включаючи назви файлів):
find . -type l -exec sh -c 'file -b "$1" | grep -q ^broken' sh {} \; -print
find -L
Трюк цитований по соло з commandlinefu виглядає красиво і Hacky, але у нього є один дуже небезпечна пастка : Всі аліаси слідують. Розгляньте каталог із вмістом, представленим нижче:
$ ls -l
total 0
lrwxrwxrwx 1 michal users 6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users 6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/
Якщо ви запускаєтесь find -L . -type l
у цьому каталозі, усі /usr/share/
також будуть шукатись (і це може зайняти дуже довго) 1 . Не використовуйте find
команду, яка не захищена від вихідних посилань-L
.
1 Це може виглядати як незначна незручність (команда "просто" займе багато часу, щоб об'їхати всі /usr/share
), але може мати більш серйозні наслідки. Наприклад, розглянемо середовища chroot: Вони можуть існувати в якомусь підкаталозі основної файлової системи і містити посилання на абсолютні місця. Ці посилання можуть здаватися розірваними для "зовнішньої" системи, оскільки вони вказують на належні місця лише після того, як ви вступили в chroot. Я також пам'ятаю, що деякі завантажувачі використовували символьні посилання під /boot
цим лише сенсом на початковій фазі завантаження, коли розділ завантаження був змонтований як /
.
Отже, якщо ви використовуєте find -L
команду для пошуку, а потім видалення зламаних символьних посилань з якогось нешкідливого вигляду каталогу, ви навіть можете зламати вашу систему ...
-type l
це зайве, оскільки-xtype l
буде працювати як-type l
на не-посиланнях. Так щоfind -xtype l
, мабуть, все, що вам потрібно. Дякую за такий підхід.