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