我正在准备一个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脚本):
最佳答案
从您的问题描述中不清楚如何处理传递链末端的断开链接。我只报告一个错误然后继续。
#!/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"
我是否正确理解您希望将指向符号链接(等递归)的符号链接替换为指向最终目标的符号链接?这个脚本做到了这一点,尽管有点过分,因为它将重写所有解析的符号链接;优化它以避免不必要地这样做是一个练习。