Я настійно пропоную не використовувати 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, мабуть, все, що вам потрібно. Дякую за такий підхід.