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


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.