Как я вижу, какие символьные ссылки существуют для данного каталога?

Вероятно, оболочка Джона не /bin/bash, но /bin/sh. На Ubuntu это - оболочка, предназначенная для выполнения сценариев быстро без необычных интерактивных функций, таких как выпуск командной строки. Проверьте последний столбец grep john /etc/passwd или getent passwd john. Вы могли бы хотеть работать chsh -s /bin/bash john изменить оболочку пользователя.

5
02.11.2010, 17:37
2 ответа

Символьные ссылки не прослежены, таким образом, необходимо будет выполнить исчерпывающий поиск. Кроме того, символьные ссылки являются текстовыми, таким образом, они сохраняют “существующими”, даже если файловая система, на которой они находятся, размонтирована (и у них может быть другая цель, если смонтировано в другом месте или если Вы переименовываете каталоги). Таким образом, большинство, которое можно сделать, является находкой, которую говорят символьные ссылки, указывающие на конкретный файл (или каталог), /target, в конкретной иерархии каталогов сказать /haystack.

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

С некоторыми версиями находки (например, на (достаточно недавний) Linux, FreeBSD или  Mac OS X), можно легко искать символьные ссылки, цель которых /target:

find -L /haystack -xtype l -samefile /target

В системах, чей find команда не имеет -samefile основной, можно использовать ksh или удар при наличии. Удалить -xtype если это также не поддерживается; затем команда также перечислит саму цель (или любая жесткая ссылка на него).

find -L /haystack -xtype l -exec ksh -c '
    for x; do [[ $0 -ef $x ]] && printf "%s\n" "$x"; done
' /target {} +

Выполнение этого только с инструментами POSIX намного более трудно, из-за отсутствия POSIX способы протестировать same-file-ness или получить информацию о символьных ссылках. Вот решение для каталогов; это предполагает, что ни в каком имени файла нет никаких новых строк.

find /haystack -type l -exec sh -c 'cd -P -- "$0" && pwd' {} \; |
  grep -Fx "$(cd -P /target && pwd)"

И вот мое обязательное zsh решение.

echo /haystack/**/*(@e\''[[ $REPLY -ef /target ]]'\')
5
27.01.2020, 20:40
  • 1
    Хорошо, это на самом деле, в чем я нуждаюсь в своем случае. В единственном каталоге без рекурсии я хочу видеть, находятся ли какие-либо символьные ссылки на нее также в том каталоге, таким образом, я знаю, вызовет ли удаление ее любую поломку. Будет find -L ./ -xtype l -samefile /target добиться цели? Если бы я перенес его в foreach () покрывающий каждый файл, то я мог бы искать все файлы символьные ссылки на них, правильно? –  user394 03.11.2010, 21:41
  • 2
    @user394: Я не понимаю требования в Вашем комментарии, существуют несколько неоднозначные “это” s и s. Вы могли повторно сформулировать его более ясно, возможно, с примерами? –  Gilles 'SO- stop being evil' 03.11.2010, 21:53
  • 3
    Для find -L /haystack -xtype l -exec ksh..., ITYM find /haystack -type l -exec ksh... если Вы действительно не намереваетесь убывать в символьные ссылки на каталоги (в этом случае, Вы использовали бы *** в zsh). –  Stéphane Chazelas 15.06.2016, 11:35
  • 4
    Отметьте это -ef требовался быть добавленным к POSIX, поскольку он широко поддерживается. –  Stéphane Chazelas 15.06.2016, 11:42

Необходимо будет искать от / использование находит (1) и -type l опция определить все ссылки, перешедшие grep (1) для изоляции интересных ссылок.

0
27.01.2020, 20:40
  • 1
    grep один мог бы быть недостаточно, если относительные ссылки включены как ../other. Вы, возможно, должны были бы развернуть обнаруженные ссылки и соответствовать полному пути к Вашему представляющему интерес dir для соответствия. поиск с помощью Google светового сигнала –  alex 02.11.2010, 18:45

Теги

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