如何找到圆形符号链接?


12

我正在使用HP-UX系统,我想查找是否有任何圆形符号链接。

到目前为止,我正在使用以下命令:

ls -lrt  `find ./ -follow -type l`

但这只会在当前目录上执行ls -lrt。

我应该使用什么命令来查找系统中的所有圆形符号链接?


1)您正在获取当前目录,因为该find命令只是打印.或不打印任何内容(因此您正在运行ls -lrtls -lrt .)对HP-UX不够了解,find无法告诉您如何解决此问题(也许它需要显式的-print? )。2)您是什么意思“圆形”? ./a -> ./b./b -> ./a?那/home/foo/a -> /home呢 还是/home/foo/a -> /home/bar/home/bar/b -> /home/foo
DerfK

循环是指所有可以创建循环的链接,因此上述所有内容。我正在尝试使用-print。
弗拉基米尔

另外,为什么不包括-follow实际上给我一些实际链接的结果呢?
弗拉基米尔·

不使用-follow,则find检查链接本身,而不检查它指向的文件。因此find . -type l-type l即使没有链接,也不会显示它们指向的内容(因为它们是文件或目录或其他指向文件或目录的链接),因此打印出是链接的内容(因为它们是)。
2011年

Answers:


18

GNU find的联机帮助页指出,在这些情况下,所有POSIX查找都应该检测文件系统循环并发出错误消息,我已经测试了

find . -follow -printf ""

在GNU find上,它能够找到表单的循环./a -> ./b./b -> ./a打印错误

find: `./a': Too many levels of symbolic links
find: `./b': Too many levels of symbolic links

(这也适用于a->b->c->a

同样,循环形式./foo/x -> .../foo/a -> ./bar+ ./bar/b -> ./foo打印错误

find: File system loop detected; `./foo/a/b' is part of the same file system loop as `./foo'.
find: File system loop detected; `./bar/b/a' is part of the same file system loop as `./bar'.
find: File system loop detected; `./foo/x' is part of the same file system loop as `.'.

如果您想对输出进行除读取之外的其他操作,则需要将其从stderr重定向到stdout,并将其通过管道传递到可以解析错误消息的某些脚本。


这是否意味着如果存在任何循环,就会出现错误消息?
弗拉基米尔

使用GNU find和-follow,是的。
2011年

好的,但是这如何解释ls不使用时仅获取而不是获取实际链接-follow
弗拉基米尔·

1
这就是外壳的工作方式。您要求它ls使用命令的输出来运行find命令。您的find命令没有输出任何内容,因此您的shell ls没有执行任何操作,列出了当前目录。
2011年

DerfK的解决方案还可以通过从cygwin shell调用Windows 7来查找Windows 7中的循环。
唐·盖特利
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.