Как найти круглые символические ссылки?

12

Я работаю над системой HP-UX и хочу выяснить, существуют ли какие-либо круглые символические ссылки.

Пока что я использую команду:

ls -lrt  `find ./ -follow -type l`

Но в результате он выполняет только ls -lrt для текущего каталога.

Какую команду я должен использовать, чтобы найти все круглые символические ссылки в системе?

Владимир
источник
1) Вы получаете текущий каталог, потому что findкоманда либо просто печатает, .либо ничего не печатает (значит, вы только запускаете ls -lrtили ls -lrt .). Не знаете достаточно о HP-UX, findчтобы рассказать, как это исправить (возможно, требуется явное -print? ). 2) Что значит "круговой"? ./a -> ./bа ./b -> ./a? Как насчет /home/foo/a -> /home? Или /home/foo/a -> /home/barа /home/bar/b -> /home/foo?
DerfK
Под круговой я подразумевал любую ссылку, которая может создать цикл, так что все вышеперечисленное. Я пытаюсь с -print прямо сейчас.
Владимир
Кроме того, почему в том числе на -followсамом деле не дает мне некоторые реальные ссылки, результаты?
Владимир
Без -follow, findпроверяет саму ссылку, а не файл, на который она указывает. Поэтому find . -type lпечатает вещи, которые являются ссылками (потому что они есть -type l), даже не глядя на то, на что они указывают (которые могут быть файлами или каталогами или другими ссылками, указывающими на файлы или каталоги).
DerfK

Ответы:

18

Страница руководства GNU find говорит, что все находки POSIX должны обнаруживать петли файловой системы и выдавать сообщения об ошибках в этих случаях, и я проверил

find . -follow -printf ""

на GNU find, который смог найти циклы формы ./a -> ./bи ./b -> ./aраспечатать ошибку

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(это также сработало a->b->c->a)

Аналогично, циклы формы ./foo/x -> ..и ./foo/a -> ./bar+ ./bar/b -> ./fooнапечатали ошибки

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

Если вы хотите что-то сделать с выводом, отличным от чтения, вам нужно будет перенаправить его из stderr в stdout и направить в какой-нибудь скрипт, который может анализировать сообщения об ошибках.

DerfK
источник
Означает ли это, что при наличии каких-либо петель появится сообщение об ошибке?
Владимир
С GNU найди и -follow, да.
DerfK
Хорошо, но как это объясняет получение просто lsвместо того, чтобы получать реальные ссылки, когда они не используются -follow?
Владимир
1
Вот как работает оболочка. Вы попросили его выполнить lsкоманду, используя вывод вашей findкоманды. Ваша findкоманда ничего не печатала, поэтому ваша оболочка выполнена lsбез чего-либо, в которой указан текущий каталог.
DerfK
Решение DerfK также находит циклы в Windows 7, вызывая его из оболочки cygwin.
Дон Гейтли