我如何(递归地)检测目录中以绝对方式而不是相对方式标识其目标的所有符号链接?
由于在移动整个目录树时这些链接很可能会中断,因此我希望有一种识别它们的方法。
如果移动目录树(如果它们碰巧指向目录树的根目录之外),即使是相对链接也可能会中断,但我认为这个问题已解决。
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 绝对路径名定义。)
您可能会发现该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 次 |
| 最近记录: |