我使用 find
命令并通过 [ \( -L $F \) ]
遍历结果来收集特定的符号链接。
我想知道在这种情况下是否有一种简单的方法来确定该链接是否已损坏(指向不存在的文件)。
以下是我的代码:
FILES=`find /target/ | grep -v '\.disabled$' | sort`
for F in $FILES; do
if [ -L $F ]; then
DO THINGS
fi
done
# 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
这应该输出无效的链接:
find /target/dir -type l ! -exec test -e {} \; -print
您还可以将操作链接到 find
命令上,例如删除损坏的链接:
find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
find -L foo -type l
不是更好吗?从快速测试来看,它确实有效且更简单。当然,你的回答展示了find的更多功能,这是一件好事。免责声明:我从很早的时候就醒着,所以可能有些遗漏。 - undefined如果符号链接原本指向一个文件或目录,但现在已经损坏,那么这将起作用。
if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then
echo "'$strFile' is a broken symlink";
fi
这将找到所有类型为“link”的文件,也会解析为类型“link”。即,一个损坏的符号链接
find /target -type l -xtype l
find -L /target -type l
- cdelacroixfind
和 -xtype
会一直解析符号链接到最后。如果符号链接是好的,它将始终解析为不是符号链接的内容。在 GNU find
和 BSD find
中使用 -L
同样如此。 - docwhat如果您不介意遍历非损坏的目录符号链接,可以使用以下命令找到所有孤立的链接:
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done
要查找所有未孤立的文件,请使用以下命令:
$ find -L /target ! -type l
/target
可能是一个文件,这种情况下目录遍历不是一个问题。 - docwhattest -e "$link"
或[[ -e "$link" ]]
的行为与预期不符,无法识别链接是否损坏。readlink(1)
来测试链接的存在性,方法如下:if [[ ! -L "$link" ]]; then
echo "Missing or not a symlink"
else
readlink -q "$link"
if [[ $? -ne 0 ]]; then
echo "Broken"
fi
fi
以下命令有什么问题:
file $f | grep 'broken symbolic link'
if [[ -h $link && ! -e $link ]] ; then
_info "$link is a BROKEN SYMLINK"
fi
find
时可以直接使用,但在其他情况下(例如通配符),应该与-h组合以处理这种情况,例如[ -h "$F" -a ! -e "$F" ]
。 - Calimo