Come posso trovare collegamenti simbolici circolari?


12

Sto lavorando su un sistema HP-UX e voglio scoprire se ci sono collegamenti simbolici circolari.

Finora sto usando il comando:

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

Ma sta facendo solo ls -lrt sulla directory corrente come risultato.

Quale comando devo usare per trovare tutti i collegamenti simbolici circolari in un sistema?


1) Stai ricevendo la directory corrente perché il findcomando o sta semplicemente stampando .o non stampando nulla (quindi stai solo eseguendo ls -lrto ls -lrt .) Non sai abbastanza su HP-UX findda dirti come risolvere questo problema (forse richiede un esplicito -print? ). 2) Cosa intendi con "circolare"? ./a -> ./be ./b -> ./a? Che dire /home/foo/a -> /home? O /home/foo/a -> /home/bare /home/bar/b -> /home/foo?
DerfK,

Con circolare intendevo qualsiasi tipo di collegamento in grado di creare un ciclo, quindi tutto quanto sopra. Sto provando con -print adesso.
Vladimir

Inoltre, perché non includermi in -followrealtà mi dà alcuni link reali sono risultati?
Vladimir

Senza -follow, findesamina il collegamento stesso, non il file a cui punta. Quindi find . -type lstampa cose che sono collegamenti (perché lo sono -type l) senza nemmeno guardare a cosa indicano (quali sarebbero file o directory o altri collegamenti che puntavano a file o directory).
DerfK,

Risposte:


18

La manpage di GNU find dice che tutti i POSIX find dovrebbero rilevare loop di filesystem ed emettere messaggi di errore in questi casi, e ho testato

find . -follow -printf ""

su GNU find, che è stato in grado di trovare loop del modulo ./a -> ./be ./b -> ./astampare l'errore

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

(anche questo ha funzionato a->b->c->a)

Allo stesso modo, i loop del modulo ./foo/x -> ..e ./foo/a -> ./bar+ hanno ./bar/b -> ./foostampato gli errori

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

Se si desidera fare qualcosa con l'output diverso da leggerlo, è necessario reindirizzarlo da stderr a stdout e reindirizzarlo a uno script in grado di analizzare i messaggi di errore.


Questo significa che se ci fossero dei loop apparirà un messaggio di errore?
Vladimir

Con GNU trova e -follow, sì.
DerfK,

Ok, ma come si spiega ottenere solo un lsinvece di ottenere collegamenti reali quando non si utilizza -follow?
Vladimir

1
Ecco come funziona la shell. Hai chiesto di eseguire il lscomando usando l'output del tuo findcomando. Il tuo findcomando non ha stampato nulla, quindi la tua shell è stata eseguita lscon nulla, che elenca la directory corrente.
DerfK,

La soluzione di DerfK trova anche cicli in Windows 7 invocandolo da una shell cygwin.
Don Gateley,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.