Saya tidak sepenuhnya mengerti apa yang Anda minta. Jika saya tidak tahu apa-apa, saya pikir Anda bertanya apakah ada cara untuk mendeteksi ini ketika sedang berurusan dengan file. Saya tidak percaya ini mungkin.
Satu-satunya metode yang dapat saya bayangkan adalah melakukan pencarian di mana Anda secara khusus mulai mencari melalui cabang tertentu di pohon direktori.
Contoh
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
The find
perintah akan mendeteksi lingkaran ini, tetapi tidak benar-benar memberitahu Anda secara keseluruhan banyak tentang hal itu.
$ 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
Saya sewenang-wenang memilih 15 level untuk memblokir setiap output yang ditampilkan oleh find
. Namun Anda dapat menjatuhkan sakelar itu ( -mindepth
) jika Anda tidak peduli tentang susunan direktori yang ditampilkan. The find
perintah masih mendeteksi loop dan berhenti:
$ 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
Secara kebetulan, jika Anda ingin mengganti default MAXSYMLINKS
yang tampaknya 40 di Linux (versi 3.x kernel yang lebih baru), Anda dapat melihat U&L T&J ini berjudul: Bagaimana Anda meningkatkan MAXSYMLINKS .
Menggunakan perintah symlinks
Ada alat yang disebut oleh pengelola situs FTP symlinks
yang akan membantu memaparkan masalah dengan alat pohon yang panjang atau menggantung yang disebabkan oleh tautan simbolis.
Dalam kasus tertentu symlinks
alat ini dapat digunakan untuk menghapus tautan yang menyinggung juga.
Contoh
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
Perpustakaan glibc
Pustaka glibc tampaknya menawarkan beberapa fungsi C di sekitar ini, tapi saya tidak sepenuhnya tahu peran mereka atau bagaimana cara menggunakannya. Jadi saya hanya bisa menunjukkannya kepada Anda.
Halaman manual, man symlink
menunjukkan definisi fungsi untuk fungsi yang disebut symlink()
. Uraiannya seperti ini:
symlink () membuat tautan simbolis bernama newpath yang berisi string oldpath.
Salah satu kesalahan menyatakan bahwa fungsi ini mengembalikan:
ELOOP Terlalu banyak tautan simbolik yang ditemukan dalam menyelesaikan jalur baru.
Saya juga akan mengarahkan Anda ke halaman manual, man path_resolution
yang membahas bagaimana Unix menentukan jalur ke item pada disk. Khususnya paragraf ini.
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 ...
tentang situasi di atas?