Je ne comprends pas bien ce que vous demandez. Si je ne savais pas mieux, je pense que vous demandiez s'il y avait un moyen de détecter cela pendant que vous traitez un fichier. Je ne pense pas que ce soit possible.
La seule méthode que je peux concevoir est de faire une recherche où vous commencez spécifiquement à parcourir une branche particulière de l'arborescence des répertoires.
Exemple
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
La find
commande détectera cette boucle mais ne vous en dira pas beaucoup à ce sujet.
$ 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
J'ai arbitrairement choisi 15 niveaux afin de bloquer toute sortie affichée par le find
. Vous pouvez cependant supprimer ce commutateur ( -mindepth
) si vous ne vous souciez pas de l'arborescence de répertoires affichée. La find
commande détecte toujours la boucle et s'arrête:
$ 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
Soit dit en passant , si vous souhaitez remplacer la valeur par défaut MAXSYMLINKS
qui est apparemment 40 sur Linux (les versions 3.x plus récentes du noyau), vous pouvez voir cette Q&R U&L intitulée: Comment augmenter MAXSYMLINKS .
Utilisation de la commande de liens symboliques
Il existe un outil que les responsables du site FTP pourraient utiliser, appelé, symlinks
qui aidera à exposer les problèmes liés aux arbres longs ou pendants qui ont été causés par des liens symboliques.
Dans certains cas, l' symlinks
outil peut également être utilisé pour supprimer les liens incriminés.
Exemple
$ 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 bibliothèque glibc
La bibliothèque glibc cherche à offrir quelques fonctions C autour de cela, mais je ne connais pas entièrement leur rôle ni comment les utiliser réellement. Je ne peux donc que vous les signaler.
La page de manuel man symlink
montre la définition de la fonction d'une fonction appelée symlink()
. La description va comme ceci:
symlink () crée un lien symbolique nommé newpath qui contient la chaîne oldpath.
L'une des erreurs indique que cette fonction renvoie:
ELOOP Trop de liens symboliques ont été rencontrés lors de la résolution de newpath.
Je vous dirigerai également vers la page de manuel, man path_resolution
qui explique comment Unix détermine les chemins d'accès aux éléments sur le disque. Plus précisément ce paragraphe.
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 ...
sur les situations ci-dessus?