3

遵循复杂的符号链接嵌套并完全捕获和报告沿途的每个符号链接(包括路径中间的符号链接)的最佳工具/编程技术是什么(有关更多信息,请参见下文) 。

这是一个具体的例子。考虑 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 应用程序时使用的符号链接略有不同。我的一半工作通常是取消嵌套(不可避免地)未记录的层次结构,以便我们知道将新代码/模块放在哪里。

4

5 回答 5

1

Tcl 有一个命令 [file type $filename] 如果它是一个链接,它将返回“链接”。它有另一个命令 [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(循环引用)

于 2009-03-17T21:03:44.997 回答
1

print如果您在循环中添加了一个,则此 python 脚本会执行此操作:

http://mail.python.org/pipermail/python-ideas/2007-December/001254.html

于 2009-03-17T21:03:45.060 回答
1

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

#!/bin/bash

函数 deref() {

    文件="${1%/}"
    计数=0
    而 [ -L "$FILE" ]; 做
        目标=`ls -l "$FILE" | sed -e 's/^.*> //'`
        [ ${TARGET:0:1} == "/" ] || TARGET="`目录名 $FILE`/$TARGET"

        # 去除尾部斜杠;-L 无法处理那些
        FILE="${TARGET%/}"

        计数=$(( 计数 + 1 ))
        [ $COUNT -eq 10 ] && 退出 1
    完毕
    回显 $FILE

}

取消引用“$ 1”
于 2009-03-17T21:05:35.163 回答
0

如果您只需要知道最终所指对象,php 具有可以做到这一点的realpath函数。

于 2009-03-17T20:55:15.173 回答
0

在 PHP 中,您可以使用is_linkreadlink

示例用法:

function dereference_link($path) {
  $parts = array();
  foreach (explode(DIRECTORY_SEPARATOR, $path) as $part) {
    $parts[] = $part;
    $partial = implode(DIRECTORY_SEPARATOR, $parts);
    if (is_link($partial)) {
      $result = dereference_link(readlink($partial) . substr($path, strlen($partial)));
      array_unshift($result, $path);
      return $result;
    }
  }
  return array($path);
}
于 2009-03-17T21:13:00.467 回答