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