Linux 删除断开的Unix链接

Linux 删除断开的Unix链接,linux,unix,shell,Linux,Unix,Shell,我想删除一个断开的链接,但在此之前我想确认该链接文件是否存在于目录中。让我们调用链接A: if [ -a A ] then print 'ya A is ther' fi 但是如果A是一个断开的链接,那么我如何检查呢?看一个例子。find-L-typel查找断开的符号链接。首先用test-d确认文件不是目录或指向目录的符号链接(如果它是目录,find将递归到其中)。因此: 如果对test的调用和对find的调用之间的链接发生变化,则很容易出现争用情况。另一种方法是告诉find不要递归 i

我想删除一个断开的链接,但在此之前我想确认该链接文件是否存在于目录中。让我们调用链接
A

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

但是如果
A
是一个断开的链接,那么我如何检查呢?

看一个例子。

find-L-typel
查找断开的符号链接。首先用
test-d
确认文件不是目录或指向目录的符号链接(如果它是目录,
find
将递归到其中)。因此:

如果对
test
的调用和对
find
的调用之间的链接发生变化,则很容易出现争用情况。另一种方法是告诉
find
不要递归

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

注意,这假设(最近的ish)GNU coreutils。有些unix系统没有使用
readlink
命令,或者使用了具有不同选项的
readlink
命令。请参阅unix.stackexchange.com,了解使用
find-L
查找和删除这些命令的原因可能很危险:@OgrePsalm33确实,感谢您的错误报告。有一种方法可以使用
find-L
,而不用递归,即使用
-prune
。请参阅我的编辑。
is_broken_symlink () {
    case $1 in -*) set "./$1";; esac
    ! [ -d "$1" ] && [ -n "$(find -L "$1" -type l)" ]
}
is_broken_symlink () {
    case $1 in -*) set "./$1";; esac
    [ -n "$(find -L "$1" -type l -print -o -prune)" ]
}