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

Mar*_*tus 10 symlink

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

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

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

Ste*_*itt 16

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

find . -type l -lname '/*'
Run Code Online (Sandbox Code Playgroud)

这要求使用 shell globbingfind打印作为符号链接且其内容(目标)匹配的文件的名称/*。

严格来说,POSIX 规定绝对路径名以一/、三个或更多开头/;为了匹配,你可以使用

find . -lname '/*' ! -lname '//*' -o -lname '///*'
Run Code Online (Sandbox Code Playgroud)

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

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


Sté*_*las 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
Run Code Online (Sandbox Code Playgroud)

并且可以为您修复链接。在这里-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
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

1352 次

最近记录:

10 年 前