Хорошо, я не думаю, что у меня действительно есть ответ здесь, но здесь он идет:
Это - насколько я мог добраться путем исследования предмета; надеюсь, что эта информация служит хорошей начальной точкой.
Я настоятельно рекомендовал бы не использовать 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. Для a find
команда, которая "неуязвима для исходящих ссылок", не использует -L
.
1 Это может быть похожим на незначительное неудобство (команда "просто" займет много времени пересекать все /usr/share
) – но может иметь более серьезные последствия. Например, рассмотрите chroot среды: Они могут существовать в некотором подкаталоге основной файловой системы и содержать символьные ссылки на абсолютные местоположения. Те связи, могло казаться, были разорваны для "внешней" системы, потому что они только указывают на надлежащие места, после того как Вы ввели chroot. Я также вспоминаю, что некоторый загрузчик использовал символьные ссылки под /boot
тот единственный имевший смысл в начальную фазу загрузки, когда раздел начальной загрузки был смонтирован как /
.
Таким образом, если Вы используете a find -L
управляйте, чтобы найти и затем удалить поврежденные символьные ссылки из некоторого безопасно выглядящего каталога, Вы могли бы даже повредить свою систему...
Я верю добавлению -L
флаг к Вашей команде позволит Вам, действительно избавляются от grep:
$ find -L . -type l
http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks
от человека:
-L Cause the file information and file type (see stat(2)) returned
for each symbolic link to be those of the file referenced by the
link, not the link itself. If the referenced file does not exist,
the file information and type will be for the link itself.
symlinks
команда из http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gz может использоваться для идентификации символьных ссылок со множеством характеристик. Например:
$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a
Поскольку rozcietrzewiacz уже прокомментировал, find -L
может иметь неожиданное последствие расширения поиска в symlinked каталоги, так не оптимальный подход. Что никто не упомянул, все же это
find /path/to/search -xtype l
более краткая, и логически идентичная команда к
find /path/to/search -type l -xtype l
Ни одно из решений, представленных до сих пор, не обнаружит циклические символьные ссылки, который является другим типом поломки. этот вопрос обращается к мобильности. Подводя итоги, портативный способ найти разорванные символьные связи, включая циклические ссылки:
find /path/to/search -type l -exec test ! -e {} \; -print
Для получения дополнительной информации посмотрите этот вопрос или ynform.org. Конечно, категорический источник для всего этого является findutils документацией.
find -L
ловушка, а также циклические ссылки. +1
– Flimm
07.10.2014, 16:00
При необходимости в другом поведении, разорвана ли связь или циклическая, можно также использовать %Y с находкой:
$ touch a
$ ln -s a b # link to existing target
$ ln -s c d # link to non-existing target
$ ln -s e e # link to itself
$ find . -type l -exec test ! -e {} \; -printf '%Y %p\n' \
| while read type link; do
case "$type" in
N) echo "do something with broken link $link" ;;
L) echo "do something with cyclic link $link" ;;
esac
done
do something with broken link ./d
do something with cyclic link ./e
Этот пример копируется с этого сообщения (удаленный сайт).
Ссылка
find
команда не поддерживает xtype
может быть получен из этого: find . type l -printf "%Y %p\n" | grep -w '^N'
. Поскольку andy бьют меня к нему с той же (основной) идеей в его сценарии, я отказывался записать это как отдельный ответ. :)
– syntaxerror
25.06.2015, 03:28
find -L . -type l |xargs symlinks
даст Вам информацию, существует ли ссылка или не на на foundfile основание.
Это настройка pulseaudio по умолчанию, чтобы связать все тома вместе. Установка
flat-volumes = no
в /etc/pulse/daemon.conf
должна исправить это!
Обычно возможности наследуются нижестоящим элементам. Как указано в manpage :
Нижестоящий элемент, созданный с помощью вилки (2), наследует копии родительских наборов возможностей.
Проблема скриптов заключается в том, что они не являются непосредственно исполняемыми. Ядро проходит через список проверок (код ядра находится в fs/binfmt_*.c). Один из них - «binfmt_script.c,», который проверяет первую строку на шебанг, затем вызывает реальный интерпретатор (тот, что в шебанге) с вашим сценарием в качестве аргумента. Поэтому вызывается стандартный/общий интерпретатор, который просто считывает сценарий в качестве аргумента.
Это означает, что вам придется установить возможность на интерпретаторе, а не на сценарии.
То же самое относится к suid
битам и другим специальным флагам.
Поэтому либо вы делаете копию вашего интерпретатора, устанавливаете на нем нужные возможности (также проверьте, что никто не может получить к нему доступ через chmod/chown), и вызываете этот скопированный интерпретатор в своем шебанге. Можно также использовать логику setcap в сценарии.
-121--31474-Будут распечатаны имена разорванных symlinks в текущем каталоге.
for l in $(find . -type l); do cd $(dirname $l); if [ ! -e "$(readlink $(basename $l))" ]; then echo $l; fi; cd - > /dev/null; done
Работает в Баше. Не знаю о других снарядах.
Я использую это в моем случае и он работает довольно хорошо, так как я знаю каталог для поиска неработающих символических ссылок:
find -L $path -maxdepth 1 -type l
и моя папка содержит ссылку на / usr / share
, но не проходит по ней.
Ссылки между устройствами и те, которые действительны для chroot и т. Д., По-прежнему являются ловушкой, но для моего случая использования этого достаточно.
Простой -простой ответ, который является вариацией версии ОП. Иногда вам просто нужно что-то легкое для ввода или запоминания:
find. | xargs file | grep -i "broken symbolic link"
Или, если вам нужно обработать терминаторы NULL:
find. -print0 | xargs -0 file | grep -i "broken symbolic link"
Самая полная (imho )команда для поиска неработающих символических ссылок без пересечения границ раздела. Обратите внимание, что аргументы символической ссылки должны содержать каталоги, а не сами символические ссылки.
find. -xdev -type d \
| stdbuf -oL xargs -d '\n' symlinks \
| stdbuf -oL grep -e '^dangling'
-type l
избыточно с тех пор-xtype l
будет работать как-type l
на нессылках. Такfind -xtype l
вероятно, все, в чем Вы нуждаетесь. Спасибо за этот подход. – quornian 17.11.2012, 23:56/proc/XXX/exe
связь разорвана. Для этого использоватьtest -e "$(readlink /proc/XXX/exe)"
. – qwertzguy 08.01.2015, 23:37find . -xtype l
означает, "находят все символьные ссылки, (окончательные) конечные файлы которых являются символьными ссылками". Но окончательная цель символьной ссылки не может быть символьной ссылкой, иначе мы можем все еще перейти по ссылке, и это не окончательная цель. С тех пор нет таких символьных ссылок, мы можем определить их как что-то еще, т.е. поврежденные символьные ссылки. – weakish 08.04.2016, 07:57l
, менее сбивает с толку меня. – weakish 22.04.2016, 15:19-L
взлом, а скорее к (вслепую) удалению поврежденных символьных ссылок в целом. – Alois Mahdal 15.07.2016, 03:22