如何在bash中找到指向符号链接的符号链接

我正在准备一个bash脚本来验证符号链接的正确性.我想诊断时间:

> @symlink坏了
> @symlink指向另一个@symlink – (用symlinks链的最终目标修复它)
> @symlink指向另一个@symlink,它被破坏了
> @symlinks链是一个循环

在诊断symlink指向符号链接的时候,我遇到了第2点的大问题.

我试图使用readlink,但它返回符号链接的最终目标而不是指向符号链接名称.我尝试在没有-f参数的情况下运行它,但它没有帮助.然后与find的组合给了我糟糕的结果……
任何人都可以帮我解决这个问题吗?

下面我将我的代码粘贴到当前版本中.

failed=0

for file in path/*
do
    if [[ -L "$file" ]]
    then
        if [[ ! -a "$file" ]]
        then
            echo "Symlink '$file' is broken -- target object doesn't exists."
            failed=1
        elif [[ -L "$(readlink -f $file)" ]]
        then
            echo "Symlink '$file' points to another symlink: '$(readlink $file)'"
            failed=1
        fi
    fi
done
exit $failed

UPDATE

测试文件结构(其中讨论了bml脚本的symlinks.sh):

《如何在bash中找到指向符号链接的符号链接》

最佳答案 从您的问题描述中不清楚如何处理传递链末端的断开链接.我将简单地报告错误并继续前进.

#!/bin/sh
rc=0
for file in path/*; do
    if [ -L "$file" ]; then
        nfile=$file
        while [ -L "$nfile" ]; do
            nfile=$(cd $(dirname "$nfile"); abspath $(readlink "$nfile"))
        done
        if ! [ -r "$nfile" ]; then
            echo "$0: $file eventually resolves to nonexistent target $nfile" >&2
            rc=1
        else
            # FIXME: maybe avoid doing this needlessly?
            rm "$file"
            ln -s "$nfile" "$file"
        fi
    fi
done
exit "$rc"

我是否正确理解您希望将符号链接符号链接(递归等)用符号链接替换为最终目标?这个脚本可以做到这一点,虽然有些过分,但它会重写所有解析的符号链接;优化这一点,以避免不必要地做它是一个练习.

点赞