Wie finde ich kreisförmige symbolische Links?

12

Ich arbeite an einem HP-UX-System und möchte herausfinden, ob kreisförmige symbolische Links vorhanden sind.

Bisher benutze ich den Befehl:

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

Es wird jedoch nur ls -lrt für das aktuelle Verzeichnis als Ergebnis ausgeführt.

Welchen Befehl soll ich verwenden, um alle kreisförmigen symbolischen Links in einem System zu finden?

Vladimir
quelle
1) Sie erhalten das aktuelle Verzeichnis, weil der findBefehl entweder nur druckt .oder nichts druckt (Sie führen also nur ls -lrtoder aus ls -lrt .). Sie wissen nicht genug über HP-UX find, um zu erfahren, wie Sie dies beheben können (möglicherweise ist ein explizites Verzeichnis erforderlich -print?). ). 2) Was meinst du mit "Rundschreiben"? ./a -> ./bund ./b -> ./a? Was ist /home/foo/a -> /home? Oder /home/foo/a -> /home/barund /home/bar/b -> /home/foo?
DerfK
Mit Rundschreiben meine ich jede Art von Verknüpfung, die eine Schleife erzeugen kann, also alles oben Genannte. Ich versuche es gerade mit -print.
Vladimir
Auch, warum gibt -followmir das Nichteinschließen von Links tatsächlich echte Ergebnisse?
Vladimir
Ohne -follow, findden Link selbst untersucht, nicht die Datei verweist er auf. So find . -type ldruckt Dinge , die Links sind (weil sie -type l) ohne auch nur einen Blick zu sehen , was sie zeigen auf (welche Dateien oder Verzeichnisse oder andere Verbindungen sein würde , die auf Dateien oder Verzeichnisse hingewiesen).
DerfK

Antworten:

18

Die Manpage von GNU find besagt, dass alle POSIX-Funde in diesen Fällen Dateisystemschleifen erkennen und Fehlermeldungen ausgeben sollen, und das habe ich getestet

find . -follow -printf ""

auf GNU find, der in der Lage war, Schleifen des Formulars zu finden ./a -> ./bund ./b -> ./aden Fehler auszudrucken

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

(das hat auch geklappt a->b->c->a)

Ebenso haben Schleifen des Formulars ./foo/x -> ..und ./foo/a -> ./bar+ ./bar/b -> ./foodie Fehler gedruckt

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

Wenn Sie etwas anderes mit der Ausgabe tun möchten, als sie zu lesen, müssen Sie sie von stderr zu stdout umleiten und an ein Skript weiterleiten, das die Fehlermeldungen auslesen kann.

DerfK
quelle
Bedeutet dies, dass bei Schleifen eine Fehlermeldung angezeigt wird?
Vladimir
Mit GNU find und -followja.
DerfK
Ok, aber wie erklärt sich das damit, dass man nur einen lsLink bekommt, anstatt aktuelle Links zu bekommen, wenn man ihn nicht benutzt -follow?
Vladimir
1
So funktioniert die Shell. Sie haben ihn gebeten, den lsBefehl anhand der Ausgabe Ihres findBefehls auszuführen . Ihr findBefehl hat nichts gedruckt, daher wurde Ihre Shell lsmit nichts ausgeführt, wodurch das aktuelle Verzeichnis aufgelistet wird.
DerfK
Die DerfK-Lösung findet auch Zyklen in Windows 7, indem sie von einer Cygwin-Shell aus aufgerufen wird.
Don Gateley