壊れたシンボリックリンクを見つける方法

壊れたシンボリックリンクを見つける方法

自分を指していないすべてのシンボリックリンクを見つける方法はありますか?

find ./ -type l

すべてのシンボリックリンクを提供しますが、どこかに行くリンクとどこにも行かないリンクを区別するわけではありません。

私は現在やっています:

find ./ -type l -exec file {} \; | grep broken

しかし、代替ソリューションが何であるかを知りたいです。

ベストアンサー1

私は強くお勧めしますいいえ作業用find -L (下記の説明を参照)。これを行う他の方法は次のとおりです。

  • 「純粋な」アプローチを使用しfindてGNU実装を想定すると、find次のようになります。

    find . -xtype l
    

    xtype逆参照されたリンクで実行されるテストです)

  • 移植性(非効率的ですが)は、次のコマンドtest -eでも実行できます。find

    find . -type l ! -exec test -e {} \; -print
    
  • いくつかのgrepトリックがより良いかもしれません(例:より安全)よりもfind -L、しかし質問で要求されたものとまったく一致しません(ファイル名を含む出力行全体のgrep)。

    find . -type l -exec sh -c 'file -b "$1" | grep -q "^broken"' sh {} \; -print
    

find -L見積もりの​​ヒントソロ~からコマンドラインプー見には良くて昔ながらですが、とても危険な罠:すべてのシンボリックリンクに従ってください。以下を含むディレクトリを検討してください。

$ ls -l
total 0
lrwxrwxrwx 1 michal users  6 May 15 08:12 link_1 -> nonexistent1
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_2 -> nonexistent2
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_3 -> nonexistent3
lrwxrwxrwx 1 michal users  6 May 15 08:13 link_4 -> nonexistent4
lrwxrwxrwx 1 michal users 11 May 15 08:20 link_out -> /usr/share/

find -L . -type lそのディレクトリで実行すると、/usr/share/すべての項目も検索されます(時間がかかる場合があります)1find「発信リンクの影響を受けない」コマンドの場合は、以下を使用しないでください。-L


1これは少し不快に思えるかもしれません( "just"コマンドはすべてのコマンドを実行するのに長い時間がかかります/usr/share)。しかし、より深刻な結果をもたらす可能性があります。たとえば、chroot環境を考えてみましょう。この環境は、基本ファイルシステムの一部のサブディレクトリに存在でき、絶対位置へのシンボリックリンクを含めることができます。 「外部」システムでは、これらのリンクが壊れているように見えます。ルートを指定すると、正しい位置を指すためです。また、一部のブートローダは、初期起動段階でのみ意味のあるシンボリックリンクを使用していたことを覚えています/boot。つまり、ブートパーティションが/

したがって、find -Lこのコマンドを使用して見かけ上無害に見えるディレクトリで壊れたシンボリックリンクを見つけて削除すると、システムが破損する可能性があります。

おすすめ記事