¿Cómo encuentro enlaces simbólicos circulares?

12

Estoy trabajando en un sistema HP-UX y quiero saber si hay algún enlace simbólico circular.

Hasta ahora estoy usando el comando:

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

Pero solo está haciendo ls -lrt en el directorio actual como resultado.

¿Qué comando debo usar para encontrar todos los enlaces simbólicos circulares en un sistema?

Vladimir
fuente
1) Está obteniendo el directorio actual porque el findcomando simplemente imprime .o no imprime nada (por lo que solo está ejecutando ls -lrto ls -lrt .) No sabe lo suficiente sobre HP-UX findpara decirle cómo solucionar esto (¿tal vez requiere un explícito -print? ) 2) ¿Qué quieres decir con "circular"? ./a -> ./by ./b -> ./a? ¿Qué hay de /home/foo/a -> /home? O /home/foo/a -> /home/bary /home/bar/b -> /home/foo?
DerfK
Por circular me refería a cualquier tipo de enlace que pueda crear un bucle así que todo lo anterior. Estoy intentando con -print en este momento.
Vladimir
Además, ¿por qué no incluir -followrealmente me da algunos enlaces reales son resultados?
Vladimir
Sin -follow, findexamina el enlace en sí, no el archivo al que apunta. Por find . -type llo tanto, imprime cosas que son enlaces (porque lo son -type l) sin siquiera mirar para ver a qué apuntan (que serían archivos o directorios u otros enlaces que apuntan a archivos o directorios).
DerfK

Respuestas:

18

La página de manual de GNU find dice que todos los hallazgos POSIX deben detectar bucles del sistema de archivos y emitir mensajes de error en estos casos, y he probado

find . -follow -printf ""

en GNU find, que pudo encontrar bucles del formulario ./a -> ./be ./b -> ./aimprimir el error

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

(esto también funcionó a->b->c->a)

Asimismo, los bucles del formulario ./foo/x -> ..y ./foo/a -> ./bar+ ./bar/b -> ./fooimprimieron los errores

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

Si desea hacer algo con la salida que no sea leerlo, necesitaría redirigirlo de stderr a stdout y canalizarlo a algún script que pueda analizar los mensajes de error.

DerfK
fuente
¿Esto significa que si hubiera algún bucle, aparecería un mensaje de error?
Vladimir
Con GNU find y -follow, sí.
DerfK
Ok, pero ¿cómo explica eso obtener solo un en lslugar de obtener enlaces reales cuando no se usa -follow?
Vladimir
1
Así es como funciona el caparazón. Le pediste que ejecutara el lscomando usando la salida de tu findcomando. Su findcomando no imprimió nada, por lo que su shell se ejecutó lssin nada, que enumera el directorio actual.
DerfK
La solución de DerfK también encuentra ciclos en Windows 7 al invocarlo desde un shell cygwin.
Don Gateley