如何(递归地)检测目录中以绝对方式(而不是相对方式)标识其目标的所有符号链接?
由于当移动整个目录树时这些链接很可能会中断,因此我希望有一种方法来识别它们。
如果移动目录树(如果它们碰巧指向目录树的根目录之外),即使相对链接也可能会中断,但我认为这已在这个问题。
答案1
要查找绝对链接,如果您支持的话,可以使用find
s-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