Вероятно, оболочка Джона не /bin/bash
, но /bin/sh
. На Ubuntu это - оболочка, предназначенная для выполнения сценариев быстро без необычных интерактивных функций, таких как выпуск командной строки. Проверьте последний столбец grep john /etc/passwd
или getent passwd john
. Вы могли бы хотеть работать chsh -s /bin/bash john
изменить оболочку пользователя.
Символьные ссылки не прослежены, таким образом, необходимо будет выполнить исчерпывающий поиск. Кроме того, символьные ссылки являются текстовыми, таким образом, они сохраняют “существующими”, даже если файловая система, на которой они находятся, размонтирована (и у них может быть другая цель, если смонтировано в другом месте или если Вы переименовываете каталоги). Таким образом, большинство, которое можно сделать, является находкой, которую говорят символьные ссылки, указывающие на конкретный файл (или каталог), /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 ]]'\')
Необходимо будет искать от /
использование находит (1) и -type l
опция определить все ссылки, перешедшие grep (1) для изоляции интересных ссылок.
grep
один мог бы быть недостаточно, если относительные ссылки включены как ../other
. Вы, возможно, должны были бы развернуть обнаруженные ссылки и соответствовать полному пути к Вашему представляющему интерес dir для соответствия. поиск с помощью Google светового сигнала
– alex
02.11.2010, 18:45
find -L ./ -xtype l -samefile /target
добиться цели? Если бы я перенес его в foreach () покрывающий каждый файл, то я мог бы искать все файлы символьные ссылки на них, правильно? – user394 03.11.2010, 21:41find -L /haystack -xtype l -exec ksh...
, ITYMfind /haystack -type l -exec ksh...
если Вы действительно не намереваетесь убывать в символьные ссылки на каталоги (в этом случае, Вы использовали бы***
вzsh
). – Stéphane Chazelas 15.06.2016, 11:35-ef
требовался быть добавленным к POSIX, поскольку он широко поддерживается. – Stéphane Chazelas 15.06.2016, 11:42