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?


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.


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.