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

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

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

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

答え2

rozcietrzewiaczがすでに述べたように、find -L検索をシンボリックリンクディレクトリに拡張すると、予期しない結果が生じる可能性があるため、最善のアプローチではありません。まだ誰も言及していないのは

find /path/to/search -xtype l

より簡潔で論理的に同等のコマンドです。

find /path/to/search -type l -xtype l

これまでに提案された解決策のどれも、別の種類の損傷である循環シンボリックリンクを検出することはできません。 この問題移植性の問題を解決します。要約すると、循環リンクを含む壊れたシンボリックリンクを見つける移植可能な方法は次のとおりです。

find /path/to/search -type l -exec test ! -e {} \; -print

詳細については、次を参照してください。この問題またはynform.org。もちろん、これらすべての究極の源はfindutils ドキュメント

答え3

コマンドはsymlinks以下から来ます。http://www.ibiblio.org/pub/Linux/utils/file/symlinks-1.4.tar.gzさまざまな特性を持つシンボリックリンクを識別するために使用できます。たとえば、

$ rm a
$ ln -s a b
$ symlinks .
dangling: /tmp/b -> a

答え4

-L私はあなたのコマンドにフラグを追加すると次のことから逃れることができると思いますgrep

$ find -L . -type l

http://www.commandlinefu.com/commands/view/8260/find-broken-symlinks

マニュアルから:

-L

各シンボリックリンク((2)を参照)が返すファイル情報と、ファイル形式を、リンクstat自体ではなくリンクが参照するファイルの情報にします。参照されたファイルが存在しない場合は、ファイル情報と種類がリンク自体に使用されます。

関連情報