web-dev-qa-db-ja.com

Bashでシンボリックリンクが壊れているかどうかを検出するにはどうすればよいですか?

findを実行し、[ \( -L $F \) ]で結果を反復処理して、特定のシンボリックリンクを収集します。

このシナリオでリンクが壊れている(存在しないファイルを指している)かどうかを判断する簡単な方法があるかどうか疑問に思っています。

ここに私のコードがあります:

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

for F in $FILES; do
    if [ -L $F ]; then
        DO THINGS
    fi
done
43
zoltanctoth
# test if file exists (test actual file, not symbolic link)
if [ ! -e "$F" ] ; then
    # code if the symlink is broken
fi
44
Roger

これにより、破損したリンクが出力されます。

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

オペレーションをfindコマンドにチェーンすることもできます。壊れたリンクを削除する:

find /target/dir -type l ! -exec test -e {} \; -exec rm {} \;
30
Shawn Chin

これは、シンボリックリンクがファイルまたはディレクトリを指していた場合に機能しますが、現在は壊れています

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

readlink -qは、リンクが不良である場合、黙って失敗します。

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
6
Andrew Schulman

これにより、タイプ「link」のすべてのファイルが検索され、タイプ「link」にも解決されます。すなわち。壊れたシンボリックリンク

find /target -type l -xtype l
3
ACyclic

壊れていないdirシンボリックリンクをたどることを気にしない場合、すべての孤立リンクを見つけるには:

 $ find -L/target -type l | -rファイルの読み取り中。 do echo $ fileは孤立しています。完了

孤立リンクではないすべてのファイルを見つけるには:

 $ find -L/target! -type l 
2
William Pursell

どうしたの:

file $f | grep 'broken symbolic link'

0
Rew Brian