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