Как я могу найти поврежденные символьные ссылки

Хорошо, я не думаю, что у меня действительно есть ответ здесь, но здесь он идет:

  1. Подключите свой ноутбук к WLAN,
  2. Соединитесь Ваш Рабочий стол к Вашему Ноутбуку (удостоверьтесь, что настроили IP правильно или имели сервер DHCP на Вашем ноутбуке),
  3. Используйте firestarter (должно быть доступным на Вашем диспетчере пакетов) создать мост между этими двумя соединениями.

Это - насколько я мог добраться путем исследования предмета; надеюсь, что эта информация служит хорошей начальной точкой.

294
25.10.2019, 15:53
11 ответов

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

366
27.01.2020, 19:26
  • 1
    я думаю -type l избыточно с тех пор -xtype l будет работать как -type l на нессылках. Так find -xtype l вероятно, все, в чем Вы нуждаетесь. Спасибо за этот подход. –  quornian 17.11.2012, 23:56
  • 2
    Знайте, что те решения не работают на все типы файловой системы. Например, это не будет работать на проверку если /proc/XXX/exe связь разорвана. Для этого использовать test -e "$(readlink /proc/XXX/exe)". –  qwertzguy 08.01.2015, 23:37
  • 3
    @Flimm find . -xtype l означает, "находят все символьные ссылки, (окончательные) конечные файлы которых являются символьными ссылками". Но окончательная цель символьной ссылки не может быть символьной ссылкой, иначе мы можем все еще перейти по ссылке, и это не окончательная цель. С тех пор нет таких символьных ссылок, мы можем определить их как что-то еще, т.е. поврежденные символьные ссылки. –  weakish 08.04.2016, 07:57
  • 4
    @JoóÁdám, "который может только быть символьной ссылкой в случае, если он повреждается". Дайте "разорванную символьную связь", или "не существуют файл" отдельный тип, вместо перегрузки l, менее сбивает с толку меня. –  weakish 22.04.2016, 15:19
  • 5
    Предупреждение в конце полезно, но обратите внимание, что это не относится -L взлом, а скорее к (вслепую) удалению поврежденных символьных ссылок в целом. –  Alois Mahdal 15.07.2016, 03:22

Я верю добавлению -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.
8
27.01.2020, 19:26

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
40
27.01.2020, 19:26
  • 1
    удара, Является этим инструментом, доступным для osx? –  qed 27.07.2014, 23:32
  • 2
    Неважно скомпилировали его. –  qed 27.07.2014, 23:51
  • 3
    По-видимому, symlinks предварительно установлен на Fedora. –  Daniel Jonsson 12.04.2015, 01:11

Поскольку 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 документацией.

33
27.01.2020, 19:26
  • 1
    Короткий, consice, и адреса find -L ловушка, а также циклические ссылки. +1 –  Flimm 07.10.2014, 16:00
  • 2
    Хороший. Последний работает над MacOSX также, в то время как ответ @rozcietrzewiacz не сделал. –  neu242 01.08.2016, 13:03

При необходимости в другом поведении, разорвана ли связь или циклическая, можно также использовать %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

Этот пример копируется с этого сообщения (удаленный сайт).

Ссылка

6
27.01.2020, 19:26
  • 1
    Еще одно сокращение от тех, чей 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 основание.

1
27.01.2020, 19:26

https://wiki.archlinux.org/index.php/PulseAudio/Troubleshooting#Per-application_volumes_change_when_the_Master_volume_is_adjusted

Это настройка pulseaudio по умолчанию, чтобы связать все тома вместе. Установка

flat-volumes = no

в /etc/pulse/daemon.conf должна исправить это!

-121--105713-

Обычно возможности наследуются нижестоящим элементам. Как указано в 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

Работает в Баше. Не знаю о других снарядах.

1
27.01.2020, 19:26

Я использую это в моем случае и он работает довольно хорошо, так как я знаю каталог для поиска неработающих символических ссылок:

find -L $path -maxdepth 1 -type l

и моя папка содержит ссылку на / usr / share , но не проходит по ней. Ссылки между устройствами и те, которые действительны для chroot и т. Д., По-прежнему являются ловушкой, но для моего случая использования этого достаточно.

2
27.01.2020, 19:26

Простой -простой ответ, который является вариацией версии ОП. Иногда вам просто нужно что-то легкое для ввода или запоминания:

find. | xargs file | grep -i "broken symbolic link"

Или, если вам нужно обработать терминаторы NULL:

find. -print0 | xargs -0 file | grep -i "broken symbolic link"
3
27.01.2020, 19:26

Для пользователей zsh:

rm -v **/*(-@)

из руководство пользователя zsh(поискbroken symlinks)

6
27.01.2020, 19:26

Самая полная (imho )команда для поиска неработающих символических ссылок без пересечения границ раздела. Обратите внимание, что аргументы символической ссылки должны содержать каталоги, а не сами символические ссылки.

find. -xdev -type d \
| stdbuf -oL xargs -d '\n' symlinks \
| stdbuf -oL grep -e '^dangling'
0
08.06.2021, 19:21

Теги

Похожие вопросы