壊れたシンボリックリンクを見つけるにはどうすればいいですか

壊れたシンボリックリンクを見つけるにはどうすればいいですか

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

find ./ -type l

すべてのシンボリック リンクが表示されますが、どこかにつながるリンクとそうでないリンクは区別されません。

現在やっていること:

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

しかし、どのような代替解決策が存在するのか疑問に思います。

答え1

強くお勧めしたいのはないfind -L タスクに使用するには(説明については下記を参照)。これを行う他の方法は次のとおりです。

  • 「純粋な」メソッドを使用したい場合find、 の GNU 実装を前提とするとfind、次のようになります。

    find . -xtype l
    

    xtype逆参照リンクに対して実行されるテストです)

  • 移植性は低いですが、コマンドtest -e内からexec を実行することもできます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引用されたトリックソロからコマンドラインfu見た目は素敵でハックっぽいですが、非常に危険な落とし穴: すべてのシンボリックリンクがたどられます。以下に示す内容のディレクトリを検討してください。

$ 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これは、一見、小さな不便さのように見えるかもしれません (コマンドは、すべての をトラバースするのに「ただ」長い時間がかかります/usr/share)。しかし、より深刻な結果を招く可能性があります。たとえば、chroot 環境を考えてみましょう。これらは、メイン ファイル システムのサブディレクトリに存在し、絶対位置へのシンボリック リンクを含むことができます。これらのリンクは、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

各シンボリックリンクに対して返されるファイル情報とファイルタイプ(stat(2)を参照)を、リンク自体ではなく、リンクによって参照されるファイルの情報とファイルタイプにします。参照されたファイルが存在しない場合は、ファイル情報とタイプはリンク自体のものになります。

関連情報