在目录树中查找所有绝对链接


8

如何(递归)检测目录中的所有符号链接,这些符号链接以绝对方式而非相对方式来标识其目标?

由于在移动整个目录树时这些链接很可能会断开,因此我希望有一种识别它们的方法。

如果移动目录树,即使相对链接也可能断开(如果它们恰好指向目录树的根之外),但是我认为这个问题已得到解决。


Answers:


15

要找到绝对链接,可以使用find-lname选项(如果find支持)(至少在GNU find,FreeBSD和macOS上可用):

find . -type l -lname '/*'

这要求find打印文件符号的名称,这些文件是符号链接,并且其内容(目标)/*使用外壳程序进行匹配。

严格来说,POSIX指定绝对路径名以一个/或三个或更多个开头/;为此,您可以使用

find . -lname '/*' ! -lname '//*' -o -lname '///*'

// foo / bar在什么系统上与/ foo / bar不同?有更多细节。

(感谢Sato Katsura指出-lname特定于GNU的内容,感谢fd0指出它实际上也至少在FreeBSD和macOS上可用,感谢StéphaneChazelas提出了POSIX绝对路径名定义。)


我正要发布:find ./ -t l -exec ls -l {} \;这应该是一个安全的选择。解析其输出可以轻松执行所需的任何操作。
Centimane


7

您可能会发现该symlinks实用程序很有用:

$ symlinks -r .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas

并可以为您修复链接。这里用-t告诉它做什么:

$ symlinks -rct .
other_fs: /home/chazelas/test/bin -> /bin
dangling: /home/chazelas/test/DIR/foo -> foo
dangling: /home/chazelas/test/blah -> not-here
absolute: /home/chazelas/test/chazelas -> /home/chazelas
changed:  /home/chazelas/test/chazelas -> ../../chazelas
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.