Як знайти кругові символічні посилання?


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

Циркулярним я мав на увазі будь-який вид зв’язку, який може створити цикл, так що все вищезазначене. Я зараз намагаюся з -друком.
— Володимир

Крім того, чому насправді включення -followне дає мені справжніх посилань - це результати?
— Володимир

Без -follow, findрозглядає саму посилання, а не файл він вказує. Тож find . -type lдрукуються речі, що є посиланнями (бо вони є -type l), навіть не дивлячись, на що вони вказують (які би були файли чи каталоги чи інші посилання, які вказували на файли чи каталоги).
— DerfK

Відповіді:


18

На сторінці пошуку GNU йдеться про те, що всі знахідки POSIX повинні виявляти петлі файлової системи та надсилати повідомлення про помилки в цих випадках, і я перевірив

find . -follow -printf ""

на GNU знайти, який зміг знайти петлі форми ./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 та передати його деякому сценарію, який може розібрати повідомлення про помилки.


Чи означає це, що якщо були цикли, з’явиться повідомлення про помилку?
— Володимир

З GNU знайти і -follow, так.
— DerfK

Гаразд, але як це пояснює отримання просто lsзамість отримання фактичних посилань, коли не використовується -follow?
— Володимир

1
Ось так працює оболонка. Ви попросили його запустити lsкоманду, використовуючи висновок вашої findкоманди. Ваша findкоманда нічого не надрукувала, тому ваша оболонка виконана lsз нічого, що перераховує поточний каталог.
— DerfK

Рішення DerfK також знаходить цикли в Windows 7, викликаючи його з оболонки cygwin.
— Дон Гейтлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.