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

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

如何(递归地)检测目录中以绝对方式(而不是相对方式)标识其目标的所有符号链接?

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

如果移动目录树(如果它们碰巧指向目录树的根目录之外),即使相对链接也可能会中断,但我认为这已在这个问题

答案1

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

find . -type l -lname '/*'

这要求find打印符号链接的文件名,并且其内容(目标)/*使用 shell 通配符匹配。

严格来讲,POSIX 指定绝对路径名以 1 开头/或三个或更多开头/;为了匹配它,你可以使用

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

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

(谢谢佐藤桂指出-lname是 GNU 特定的,FD0值得一提的是,它实际上至少也可以在 FreeBSD 和 macOS 上使用,并且斯蒂芬·查泽拉斯用于调出 POSIX 绝对路径名定义。)

答案2

您可能会发现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

相关内容