java - 我如何跟踪并完整报告符号链接(symbolic link)链?

标签 java php unix shell symlink

跟踪复杂的符号链接(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/

相关文章:

java - 覆盖 HashSet 的包含方法

java - 服务器端如何管理大量用户?

php - 从 iOS 应用程序将多部分图像上传到 PHP 服务器

javascript - 涉及 AJAX 的函数不返回值 - jQuery

php - password_hash 中的成本选项是什么?

linux - UNIX 域 STREAM 和 DATAGRAM 套接字之间的区别?

linux - 根据文本文件内容中的行数运行循环次数(Unix Shell 脚本)

java - 如何中断当前正在运行的线程?

Java Oracle jdbc COLUMN 语句

linux - 通过 bash 脚本检查服务是否正在运行