我不完全了解您的要求。如果我不了解,我想您是在问是否有一种方法可以在处理文件时检测到这一点。我不认为这是可能的。
我能想到的唯一方法是进行查找,从特定位置开始查找目录树中的特定分支。
例
$ tree
.
`-- a
`-- b
|-- c
| `-- d
| `-- e -> ../../../../a/b
`-- e -> e
5 directories, 1 file
该find
命令将检测到此循环,但不会真正告诉您很多有关该循环的信息。
$ 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
我任意选择了15个电平,以阻止显示的任何输出find
。但是,-mindepth
如果您不关心显示的目录树,则可以删除该开关()。该find
命令仍然检测到循环并停止:
$ 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
顺便说一句,如果您想覆盖默认值MAXSYMLINKS
(在Linux(内核的3.x新版本)上显然是40),则可以看到标题为:如何增加MAXSYMLINKS的此U&L问答。
使用symlinks命令
FTP站点维护人员可以使用一种称为的工具,该工具symlinks
将帮助解决由符号链接引起的工具太长或悬挂树的问题。
在某些情况下,该symlinks
工具也可用于删除违规链接。
例
$ symlinks -srv a
lengthy: /home/saml/tst/99159/a/b/c/d/e -> ../../../../a/b
dangling: /home/saml/tst/99159/a/b/e -> e
glibc库
glibc库似乎提供了一些与此相关的C函数,但我并不完全知道它们的作用或如何实际使用它们。因此,我只能将它们指出给您。
手册页man symlink
显示了名为的函数的函数定义symlink()
。描述如下:
symlink()创建一个名为newpath的符号链接,其中包含字符串oldpath。
错误之一表明此函数返回:
ELOOP在解析newpath时遇到太多符号链接。
我还将带您到手册页,man path_resolution
该手册页讨论Unix如何确定磁盘上项目的路径。特别是本段。
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 ...
对上述情况有何看法?