2010-09-03 88 views
3

我想删除损坏的链接,但在此之前我想确认链接文件是否存在于目录中。让我们把链接A删除损坏的链接Unix

if [ -a A ] then 
    print 'ya A is ther' 
fi 

但如果A是断开的链接,然后我该怎么检查?

回答

4

find -L -type l发现破碎的符号链接。首先确认该文件不是目录或符号链接到test -d(如果它是一个目录,find会递归到该目录)。因此:

is_broken_symlink() { 
    case $1 in -*) set "./$1";; esac 
    ! [ -d "$1" ] && [ -n "$(find -L "$1" -type l)" ] 
} 

这是容易出现竞争情况,如果调用test和调用find之间的关系变化。另一种方法是告诉find不要递归。

is_broken_symlink() { 
    case $1 in -*) set "./$1";; esac 
    [ -n "$(find -L "$1" -type l -print -o -prune)" ] 
} 
+1

看到这个unix.stackexchange.com回答为什么使用'find -L'来查找和删除这些可能是危险的:http://unix.stackexchange.com/a/38691 – 2014-02-06 14:37:40

+0

@ OgrePsalm33的确,感谢您的错误报告。有一种使用'find -L'的方法,不用递归,而是使用'-prune'。看我的编辑。 – Gilles 2014-02-06 15:53:59

2
if readlink -qe A > /dev/null; then 
    echo "link works" 
fi 
+0

请注意,这里假设(最近ish)GNU coreutils。有没有'readlink'命令的unix系统,或者有'readlink'命令可以选择不同的选项。 – Gilles 2010-09-03 17:41:50