No entiendo completamente lo que estás preguntando. Si no supiera nada mejor, creo que me preguntaba si había una manera de detectar esto mientras se trataba de un archivo. No creo que esto sea posible.
El único método que puedo concebir es hacer una búsqueda en la que empiezas específicamente a buscar a través de una rama en particular en el árbol de directorios.
Ejemplo
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
El find
comando detectará este bucle pero en realidad no le dirá mucho al respecto.
$ find -L . -mindepth 15
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Elegí arbitrariamente 15 niveles para bloquear cualquier salida que muestre el find
. Sin embargo, puede soltar ese interruptor ( -mindepth
) si no le importa que se muestre el árbol de directorios. El find
comando aún detecta el bucle y se detiene:
$ find -L .
.
./a
./a/b
./a/b/c
./a/b/c/d
find: File system loop detected; `./a/b/c/d/e' is part of the same file system loop as `./a/b'.
find: `./a/b/e': Too many levels of symbolic links
Por cierto, si desea anular el valor predeterminado MAXSYMLINKS
que aparentemente es 40 en Linux (versiones 3.x más nuevas del núcleo), puede ver estas preguntas y respuestas de U&L tituladas: ¿Cómo aumentar MAXSYMLINKS ?
Usando el comando symlinks
Hay una herramienta que los mantenedores de sitios FTP podrían usar llamada symlinks
que ayudará a exponer problemas con la herramienta de árboles largos o colgantes que fueron causados por enlaces simbólicos.
En ciertos casos, la symlinks
herramienta también podría usarse para eliminar enlaces ofensivos.
Ejemplo
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
La biblioteca glibc
La biblioteca glibc parece ofrecer algunas funciones C en torno a esto, pero no conozco completamente su función o cómo usarlas realmente. Así que solo puedo señalarlos.
La página del manual, man symlink
muestra la definición de función para una función llamada symlink()
. La descripción es así:
symlink () crea un enlace simbólico llamado newpath que contiene la cadena oldpath.
Uno de los errores indica que esta función devuelve:
ELOOP Se encontraron demasiados enlaces simbólicos al resolver newpath.
También lo dirigiré a la página de manual, man path_resolution
que analiza cómo Unix determina las rutas a los elementos en el disco. Específicamente este párrafo.
If the component is found and is a symbolic link (symlink), we first
resolve this symbolic link (with the current lookup directory as starting
lookup directory). Upon error, that error is returned. If the result is
not a directory, an ENOTDIR error is returned. If the resolution of the
symlink is successful and returns a directory, we set the current lookup
directory to that directory, and go to the next component. Note that the
resolution process here involves recursion. In order to protect the
kernel against stack overflow, and also to protect against denial of
service, there are limits on the maximum recursion depth, and on the maximum
number of symbolic links followed. An ELOOP error is returned when the
maximum is exceeded ("Too many levels of symbolic links").
readlink ...
sobre las situaciones anteriores?