Ich verstehe nicht ganz, was Sie fragen. Wenn ich es nicht besser wüsste, haben Sie sich wahrscheinlich gefragt, ob es eine Möglichkeit gibt, dies während des Umgangs mit einer Datei zu erkennen. Ich glaube nicht, dass das möglich ist.
Die einzige Methode, die ich mir vorstellen kann, ist das Durchsuchen eines bestimmten Zweigs im Verzeichnisbaum.
Beispiel
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
Der find
Befehl erkennt diese Schleife, sagt Ihnen aber nicht wirklich viel darüber.
$ 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
Ich habe willkürlich 15 Stufen ausgewählt, um die Ausgabe der zu blockieren find
. Sie können diesen Schalter ( -mindepth
) jedoch fallen lassen, wenn Sie sich nicht für den angezeigten Verzeichnisbaum interessieren. Der find
Befehl erkennt die Schleife weiterhin und stoppt:
$ 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
Übrigens , wenn Sie die Standardeinstellung außer Kraft zu setzen , MAXSYMLINKS
die scheinbar 40 auf Linux (neuere 3.x Versionen des Kernels) ist , dass Sie diese U & L sehen Q & A Titel: How do you MAXSYMLINKS erhöhen .
Verwenden Sie den Befehl symlinks
Es gibt ein Tool, das von Betreuern von FTP-Sites verwendet werden kann. symlinks
Mit diesem Tool können Probleme mit langen oder baumelnden Bäumen aufgedeckt werden, die durch symbolische Links verursacht wurden.
In bestimmten Fällen kann das symlinks
Tool auch verwendet werden, um störende Links zu löschen.
Beispiel
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
Die glibc Bibliothek
Die glibc-Bibliothek scheint einige C-Funktionen zu bieten, aber ich weiß nicht genau, welche Rolle sie spielt oder wie man sie tatsächlich benutzt. Deshalb kann ich Sie nur darauf hinweisen.
Die Manpage man symlink
zeigt die Funktionsdefinition für eine aufgerufene Funktion symlink()
. Die Beschreibung lautet wie folgt:
symlink () erstellt einen symbolischen Link mit dem Namen newpath, der den String oldpath enthält.
Einer der Fehler besagt, dass diese Funktion Folgendes zurückgibt:
ELOOP Beim Auflösen von newpath wurden zu viele symbolische Links gefunden.
Ich werde Sie auch auf die Manpage weiterleiten, auf man path_resolution
der erläutert wird, wie Unix die Pfade zu Elementen auf der Festplatte ermittelt. Speziell dieser Absatz.
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 ...
zu den oben genannten Situationen?