【问题标题】:Deleting a broken link Unix删除断开的链接 Unix
【发布时间】:2010-09-03 17:06:04
【问题描述】:

我想删除一个损坏的链接,但在此之前我想确认链接文件是否存在于目录中。让我们调用链接A

if [ -a A ] then 
  print 'ya A is ther'
fi

但是如果A 是一个断开的链接,那么我该如何检查呢?

【问题讨论】:

    标签: linux unix shell


    【解决方案1】:

    find -L -type l 查找损坏的符号链接。首先用test -d 确认该文件不是目录或指向目录的符号链接(如果是目录,find 将递归到其中)。因此:

    is_broken_symlink () {
        case $1 in -*) set "./$1";; esac
        ! [ -d "$1" ] && [ -n "$(find -L "$1" -type l)" ]
    }
    

    如果对test 的调用和对find 的调用之间的链接发生变化,这很容易出现竞争情况。另一种方法是告诉find 不要递归。

    is_broken_symlink () {
        case $1 in -*) set "./$1";; esac
        [ -n "$(find -L "$1" -type l -print -o -prune)" ]
    }
    

    【讨论】:

    • 查看这个 unix.stackexchange.com 答案,了解为什么使用 find -L 查找和删除这些可能很危险:unix.stackexchange.com/a/38691
    • @OgrePsalm33 确实,感谢您的错误报告。有一种方法可以使用find -L 而无需递归,使用-prune。查看我的编辑。
    【解决方案2】:
    if readlink -qe A > /dev/null; then
        echo "link works"
    fi
    

    【讨论】:

    • 请注意,这是假设(最近的)GNU coreutils。有些 unix 系统没有 readlink 命令,或者带有带有不同选项的 readlink 命令。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-21
      • 2023-01-30
      • 1970-01-01
      相关资源
      最近更新 更多