Я настоятельно рекомендую не использовать 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
что, вероятно, все, что вам нужно. Спасибо за такой подход./proc/XXX/exe
ссылка не работает. Для этого используйтеtest -e "$(readlink /proc/XXX/exe)"
.find . -xtype l
означает «найти все символические ссылки, чьи (конечные) целевые файлы являются символическими ссылками». Но конечной целью символической ссылки не может быть символическая ссылка, в противном случае мы все равно можем перейти по ссылке, и она не является конечной целью. Поскольку таких символических ссылок нет, мы можем определить их как что-то еще, то есть неработающие символические ссылки.l
, меня не смущает.-L
хаку, а скорее к (слепому) удалению битых символических ссылок в целом.Команда
symlinks
из http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz может использоваться для идентификации символических ссылок с различными характеристиками. Например:источник
symlinks
предустановлен на Fedora.Как уже прокомментировал rozcietrzewiacz, это
find -L
может привести к неожиданным последствиям расширения поиска в каталоги с символическими ссылками, поэтому не является оптимальным подходом. Что еще никто не упомянул, так это то, чтоявляется более краткой и логически идентичной командой
Ни одно из представленных решений пока не обнаружит циклические символические ссылки, что является еще одним типом поломки. этот вопрос касается переносимости. Подводя итог, можно сказать, что переносимый способ поиска неработающих символических ссылок, в том числе циклических ссылок:
Для получения дополнительной информации см. Этот вопрос или ynform.org . Конечно, окончательным источником всего этого является документ findutils .
источник
find -L
а также к циклическим связям. +1-xtype
не указано в POSIX, и действительно, если вы посмотрите наfind(1)
MacOS, он имеет,-type
но не-xtype
.Я считаю, что добавление
-L
флага в вашу команду позволит вам избавиться от grep:http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
от мужчины:
источник
Если вам нужно другое поведение, независимо от того, является ли ссылка разорванной или циклической, вы также можете использовать% Y с find:
Этот пример скопирован из этого поста (сайт удален) .
Ссылка
источник
find
команда не поддерживаетxtype
может быть получена из этого:find . type l -printf "%Y %p\n" | grep -w '^N'
. Когда Энди опередил меня с той же (основной) идеей в своем сценарии, я не хотел писать это как отдельный ответ. :)Я использую это для моего случая, и он работает довольно хорошо, так как я знаю каталог для поиска битых символических ссылок:
и моя папка содержит ссылку на
/usr/share
нее, но не пересекает ее. Ссылки между устройствами и те, которые действительны для chroot и т. Д., Все еще являются ловушкой, но для моего случая использования этого достаточно.источник
Простой и понятный ответ, который является вариацией версии OP. Иногда вы просто хотите что-то легко напечатать или запомнить:
источник
find -L . -type l |xargs symlinks
предоставит вам информацию о том, существует ли ссылка для каждого найденного файла.источник
Это выведет имена неработающих символических ссылок в текущем каталоге.
Работает в Баш. Не знаю о других снарядах.
источник