如何检测Bash中符号链接是否被破坏?

zol*_*oth 44 bash symlink

我运行find并迭代结果,[ \( -L $F \) ]以收集某些符号链接.

我想知道在这种情况下是否有一种简单的方法来确定链接是否被破坏(指向一个不存在的文件).

这是我的代码:

FILES=`find /target/ | grep -v '\.disabled$' | sort`

for F in $FILES; do
    if [ -L $F ]; then
        DO THINGS
    fi
done
Run Code Online (Sandbox Code Playgroud)

小智 46

# test if symlink is broken (by seeing if it links to an existing file)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi
Run Code Online (Sandbox Code Playgroud)

  • 您并没有真正用这种方法测试符号链接。 (3认同)
  • 请注意,如果文件根本不存在,该代码也将被执行。find很好,但是在其他情况下(例如glob),应与-h结合使用以处理这种情况,例如`[-h“ $ F” -a!-e“ $ F”]`。 (2认同)
  • @Melab错误...在发表评论之前,请测试您的假设:https://git.io/fx95w此答案不正确。 (2认同)

Sha*_*hin 30

这应打印出已损坏的链接:

find /target/dir -type l ! -exec test -e {} \; -print
Run Code Online (Sandbox Code Playgroud)

您还可以将操作find链接到命令,例如删除损坏的链接:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
Run Code Online (Sandbox Code Playgroud)


Aqu*_*wer 7

如果符号链接指向文件或目录,这将有效,但现在已损坏

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
  echo "'$strFile' is a broken symlink"; 
fi
Run Code Online (Sandbox Code Playgroud)

  • @Sosi我们想测试符号链接是否正常工作,-L 为真,即使文件只是一个损坏的符号链接 (2认同)

And*_*man 6

readlink -q 如果链接错误,将无声地失败:

for F in $FILES; do
    if [ -L $F ]; then
        if readlink -q $F >/dev/null ; then
            DO THINGS
        else
            echo "$F: bad link" >/dev/stderr
        fi
    fi
done
Run Code Online (Sandbox Code Playgroud)