2011-11-08 71 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

你能不能有一個符號鏈接符號鏈接是不破「? –