【问题标题】:How to compare 2 symbolic links in unix (Linux)?如何比较unix(Linux)中的2个符号链接?
【发布时间】:2009-07-14 09:41:55
【问题描述】:

在 Unix 中比较两个符号链接的优雅方法是什么?

假设我输入了以下命令:

ln -s /usr/share/g s1
ln -s /usr/share/g s2
ln -s ../share/g /usr/lib/s3
ln -s /usr/share/h s4

然后我想要一个命令说 s1 和 s2 相等(/usr/share/g 是否实际存在不相关),s1 和 s4 不相等,s2 和 s4 不相等。 (就我的目的而言,报告 s3 与 s1 和 s2 不同就足够了;但是,如果可以在路径规范化之后进行比较,那可能会有用。)

【问题讨论】:

    标签: linux bash unix


    【解决方案1】:

    对于 GNU 系统(可能还有其他系统,但我不能说),有 readlink(1):

    $ touch a
    $ ln -s a b
    $ readlink b
    a
    

    您可以在比较中使用它:

    $ test $(readlink -f a) = $(readlink -f b)
    $ echo $?
    0
    

    【讨论】:

    • 谢谢!这就是我一直在寻找的。​​span>
    【解决方案2】:

    您可以对文件执行 stat -L 并比较设备和 inode 编号。 快速示例:

    #!/bin/bash
    DI_A=$(stat -c "%d.%i" -L "$1")
    DI_B=$(stat -c "%d.%i" -L "$2")
    
    if [ "$DI_A" == "$DI_B" ]; then
       echo "same file"
    else
       echo "other file"
    fi
    

    【讨论】:

      【解决方案3】:

      使用stat -L 或解析ls -l 的输出(使用sed 或cut 或类似方法):

      fileone=`ls -l s1 | sed 's/.*-> //'`
      filetwo=`ls -l s2 | sed 's/.*-> //'`
      if [ "$fileone" = "$filetwo" ]
      then
          echo "They're the same!"
      fi
      

      要规范化路径,请使用 realpath:

      fileone=`ls -1 s1 | sed 's/.*-> //'`
      fileone=`realpath $fileone`
      # etc...
      

      【讨论】:

      • 在包含“->”的文件名上打断...不过感谢您提供的真实路径提示。
      • True...不能说我曾经有过任何带有 -> 的文件。阅读链接绝对是要走的路。
      【解决方案4】:

      我能想到的 2 种方法,您可以在两个文件上使用 ls -l。您可以在输出的“->”之后看到实际路径。例如

      # ls -ltr msdfasdffff
      lrwxrwxrwx 1 root root 10 Jun 30 19:05 msdfasdffff -> blah.sh
      

      您可以使用

      获取文件名
      # ls -l msdfasdffff  | awk -F"-> " '{print $NF}'
      blah.sh
      

      然后您可以与另一个链接进行比较。

      另一种方法是使用查找

      # var1=$(find . -name "s1" -printf "%l")
      # var2=$(find . -name "s2" -printf "%l")
      

      然后您可以使用 if/else 比较这两个变量

      【讨论】:

      • thx,但是 awk 方法会在包含“->”作为子字符串的文件名上中断; find 方法有效,但缺少一些条件来限制搜索到一个文件;那么我更喜欢 readlink 命令。
      猜你喜欢
      • 1970-01-01
      • 2010-09-29
      • 2011-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      相关资源
      最近更新 更多