我正在准备一个bash脚本来验证符号链接的正确性。我想诊断什么时候:
@符号链接已断开
@symlink指向另一个@symlink--(用symlinks链的最终目标修复)
@symlink指向另一个@symlink,它已断开
@符号链是一个循环
当symlink指向symlink时,我在诊断第2)点时遇到了很大的问题。
我试图使用readlink,但它返回symlinks链的最终目标,而不是指向的symlink名称。我试图在没有-f参数的情况下运行它,但是没有帮助。然后和“发现”的组合给了我糟糕的结果。。。
有人能帮我解决这个问题吗?
下面我粘贴了当前版本的代码。

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

更新
测试文件结构(其中讨论了symlinks.sh的bash脚本):
bash - 如何在bash中找到指向符号链接(symbolic link)的符号链接(symbolic link)-LMLPHP

最佳答案

从您的问题描述中不清楚如何处理传递链末端的断开链接。我只报告一个错误然后继续。

#!/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"

我是否正确理解您希望将指向符号链接(等递归)的符号链接替换为指向最终目标的符号链接?这个脚本做到了这一点,尽管有点过分,因为它将重写所有解析的符号链接;优化它以避免不必要地这样做是一个练习。

09-08 01:23