跟踪复杂的符号链接(symbolic link)嵌套并完全捕获和报告沿途的每个符号链接(symbolic link)(包括路径中间的链接)的最佳工具/编程技术是什么(有关更多信息,请参见下文).
这是一个具体的例子。考虑 shell 命令的以下输出
ls -l /Library/Java/Home
lrwxr-xr-x 1 root admin 48 Feb 24 12:58 /Library/Java/Home -> /System/Library/Frameworks/JavaVM.framework/Home
ls 命令让您知道文件/Library/Java/Home 文件是指向另一个位置的符号链接(symbolic link)。然而,它并没有让你知道它指向的东西也是一个符号链接(symbolic link)
ls -l /System/Library/Frameworks/JavaVM.framework/Home
lrwxr-xr-x 1 root wheel 24 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Home -> Versions/CurrentJDK/Home
反过来,这不会让您知道指向文件的部分路径是一个符号链接(symbolic link)。
ls -l /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK
lrwxr-xr-x 1 root wheel 3 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK -> 1.5
为了完成这个故事,这是另一个符号链接(symbolic link)
ls -l /System/Library/Frameworks/JavaVM.framework/Versions/1.5
lrwxr-xr-x 1 root wheel 5 Feb 24 12:58 /System/Library/Frameworks/JavaVM.framework/Versions/1.5 -> 1.5.0
最后指向一个“真正的”文件夹。
是否有任何工具可以以某种方式(图形或纯旧文本)为您可视化完整的链接链?我敢肯定有人可以自己编写脚本(如果你愿意,请这样做并分享!),但这似乎是一种充满“哦,废话,边缘情况。哦,废话,另一个边缘案例”。我希望有人已经解决了这个问题。
我从事自由职业/契约(Contract)工作,每个人在网络服务器上安装 PHP 应用程序时使用的符号链接(symbolic link)略有不同。我的一半工作通常是取消嵌套这个(不可避免地)未记录的层次结构,以便我们知道将新代码/模块放在哪里。
最佳答案
Tcl 有一个命令 [file type $filename] 如果它是一个链接,它将返回“link”。它有另一个命令 [file link $filename] 将返回链接指向的内容。使用这两个命令,可以获取链接并跟随链接,直到到达实际文件。
也许我脑子里冒出这样的事情:
#!/usr/bin/tclsh
proc dereferenceLink {path {tree {}}} {
if {[file type $path] == "link"} {
set pointsTo [file link $path]
if {[lsearch -exact $tree $path] >= 0} {
lappend tree $path
return "[join $tree ->] (circular reference)"
} else {
lappend tree $path
return [dereferenceLink $pointsTo $tree]
}
} else {
lappend tree $path
return [join $tree "->"]
}
}
puts [dereferenceLink [lindex $argv 0]]
您将获得如下所示的输出:
foo->bar->baz
如果有一个循环链接,它看起来像:
foo->bar->baz->foo (circular reference)
关于java - 我如何跟踪并完整报告符号链接(symbolic link)链?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/655982/