2011-11-08 65 views
35

我跑find并通过与[ \(-L $F \) ]结果迭代收集特定的符号链接。如何检测Bash中符号链接是否被破坏?

我想知道如果有一个简单的方法来确定链路在这种情况下损坏(指向一个不存在的文件)。

这里是我的代码:

for F in $FILES; do 
    if [ -L $F ]; then 
     if readlink -q $F >/dev/null ; then 
      DO THINGS 
     else 
      echo "$F: bad link" >/dev/stderr 
     fi 
    fi 
done 

回答

39
# test if file exists (test actual file, not symbolic link) 
if [ ! -e "$F" ] ; then 
    # code if the symlink is broken 
fi 
+0

请注意,如果文件不根本不存在的代码也将执行此行为。这是罚款'find',但在其他情况下(如水珠)应与-h相结合来处理这种情况下,例如'[-h“$ F” -a! -e“$ F”]'。 – Calimo

+0

你不是真的用这种方法测试符号链接。 –

+0

@Calimo没有区别。 – Melab

7

readlink -q将失败默默

find /target/dir -type l ! -exec test -e {} \; -print 

您也可以链入对find命令的操作,例如,删除断开的链接:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \; 
+0

这似乎相当不错的,如果该文件实际上是一个符号链接,这只是返回true。但即使添加-q,readlink也会输出linux上的链接名称。如果这是一般情况,也许答案应该更新为'readlink -q $ F> dev/null'。或者我错过了什么? – zoltanctoth

+1

不,你说得对。更正,谢谢。 –

+0

哪个版本?我看不到我的系统 的readlink --version 的readlink(的coreutils)5.2.1 –

26

这应该打印出被断开链接:如果链接是坏

FILES=`find /target/ | grep -v '\.disabled$' | sort` 

for F in $FILES; do 
    if [ -L $F ]; then 
     DO THINGS 
    fi 
done 
2

如果你不介意穿越非破碎目录符号链接,找到所有孤立的链接:

 
$ find -L /target -type l | while read -r file; do echo $file is orphaned; done 

要查找未孤立的链接的所有文件:

 
$ find -L /target ! -type l 
+1

但是,这遵循非破坏符号链接到目录,我们可能不需要。 – rafak

5

这将工作,如果符号链接是指向一个文件或目录,但现在坏了

if [[ -L "$strFile" ]] && [[ ! -a "$strFile" ]];then 
    echo "'$strFile' is a broken symlink"; 
fi 
2

这种认定型“链接”,这也解决了一类“联系”的所有文件。即。一个破碎的符号链接

find /target -type l -xtype l 
+1

变种:'找到-L /目标型l' – cdelacroix

+0

你能不能有一个符号链接符号链接是不破“? –