Jak znaleźć okrągłe linki symboliczne?

12

Pracuję na systemie HP-UX i chcę sprawdzić, czy są jakieś okrągłe łącza symboliczne.

Do tej pory używam polecenia:

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

Ale w wyniku tego działa tylko ls -lrt w bieżącym katalogu.

Jakiego polecenia należy użyć, aby znaleźć wszystkie okrągłe dowiązania symboliczne w systemie?

Vladimir
źródło
1) Otrzymujesz bieżący katalog, ponieważ findpolecenie albo po prostu drukuje, .albo nie drukuje niczego (więc właśnie uruchamiasz ls -lrtlub ls -lrt .). Nie wiem wystarczająco dużo o HP-UX, findaby powiedzieć ci, jak to naprawić (może to wymaga jawnego -print? ). 2) Co masz na myśli mówiąc „okrągły”? ./a -> ./bi ./b -> ./a? Co /home/foo/a -> /home? Czy /home/foo/a -> /home/bari /home/bar/b -> /home/foo?
DerfK
Przez okólnik rozumiałem jakikolwiek link, który może stworzyć pętlę, więc wszystkie powyższe. Próbuję teraz z opcją -print.
Vladimir
Ponadto, dlaczego tak -follownaprawdę nie podaje mi prawdziwych linków to wyniki?
Vladimir
Bez -follow, findbada sam odnośnik, a nie plik to wskazuje. Tak więc find . -type ldrukuje rzeczy, które są linkami (ponieważ są -type l), nawet nie patrząc na to, na co wskazują (którymi są pliki lub katalogi lub inne linki prowadzące do plików lub katalogów).
DerfK

Odpowiedzi:

18

Strona podręcznika GNU find mówi, że wszystkie znaleziska POSIX mają wykrywać pętle systemu plików i emitować komunikaty o błędach w tych przypadkach, a ja przetestowałem

find . -follow -printf ""

na GNU find, który był w stanie znaleźć pętle formularza ./a -> ./bi ./b -> ./awydrukować błąd

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

(to też działało a->b->c->a)

Podobnie, pętle formularza ./foo/x -> ..i ./foo/a -> ./bar+ ./bar/b -> ./foowydrukowały błędy

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 `.'.

Jeśli chcesz zrobić coś z wyjściem innym niż odczyt, musisz przekierować go ze stderr na stdout i potokować go do jakiegoś skryptu, który może przeanalizować komunikaty o błędach.

DerfK
źródło
Czy to oznacza, że ​​gdyby były jakieś pętle, pojawiłby się komunikat o błędzie?
Vladimir
Z GNU znajdź i -followtak.
DerfK
Ok, ale jak to wyjaśnia, że lszamiast korzystać z rzeczywistych linków zamiast uzyskiwania rzeczywistych linków -follow?
Vladimir
1
Tak działa powłoka. Poprosiłeś go, aby uruchomił lspolecenie, korzystając z danych wyjściowych findpolecenia. Twoje findpolecenie nic nie wydrukowało, więc twoja powłoka została wykonana lsbez niczego, co zawiera bieżący katalog.
DerfK
Rozwiązanie DerfK znajduje również cykle w Windows 7, wywołując je z powłoki cygwin.
Don Gateley,