有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java我如何跟踪并完整报告一系列符号链接?

<> P>什么是最好的工具/编程技术,用于跟踪一个复杂的嵌套Syrink <强>,并完全捕获并报告沿途的每个链接,包括路径中间的(参见下面的更多信息)< /强>

这里有一个具体的例子。考虑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文件是指向另一个位置的符号链接。然而,它不会让你知道它指向的东西也是一个符号链接

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

反过来,这不会让您知道指向文件的路径的部分是符号链接

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

为了完成这个故事,这是另一个符号链接

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

最后指向一个“真正的”文件夹

是否有任何工具可以以某种方式(图形或纯文本)可视化整个链接链?我相信大家可以自己编写脚本(如果你想,请编写并分享!),但这似乎是一种充满“哦,糟了,边缘案件。哦,糟了,另一个边缘案件”的事情。我希望已经有人去麻烦了

我从事自由职业者/合同工作,每个人使用符号链接在web服务器上安装PHP应用程序的方式略有不同。我的一半工作通常是取消这个(不可避免的)未记录层次结构的嵌套,以便我们知道新代码/模块应该放在哪里


共 (3) 个答案

  1. # 1 楼答案

    这是一个bash脚本,我前阵子拼凑了一段时间来做这个。它会找到“>;”在ls输出中,指示遍历链接的符号链接。我不能保证在边缘情况下有完美的行为(例如,为了避免循环,遵循十个链接后很难放弃),但对我来说效果很好

    #!/bin/bash 
    
    function deref() {
    
        FILE="${1%/}"
        COUNT=0
        while [ -L "$FILE" ]; do
            TARGET=`ls -l "$FILE" | sed -e 's/^.*> //'`
            [ ${TARGET:0:1} == "/" ] || TARGET="`dirname $FILE`/$TARGET"
    
            # strip trailing slashes; -L cannot handle those
            FILE="${TARGET%/}"
    
            COUNT=$(( COUNT + 1 ))
            [ $COUNT -eq 10 ] && exit 1
        done
        echo $FILE
    
    }
    
    deref "$1"
    
  2. # 3 楼答案

    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)