Linuxで壊れたシンボリックリンクを見つけて削除する方法
Linux上のシンボリックリンクは素晴らしい機能ですが、壊れてしまい、何も指さなくなることがあります。壊れたシンボリックリンクを見つけ、確認し、必要であればシステムから削除する方法を紹介します。
シンボリックリンク101
シンボリックリンク、または「ソフトリンク」や「シンリンク」とも呼ばれるものは、ファイルやディレクトリを指すショートカットの一種です。シンリンクは、ファイルマネージャウィンドウの通常のファイルやディレクトリのように見えます。また、ターミナルウィンドウのファイルリストにもエントリとして表示されます。シンリンクが指すファイルやディレクトリは、ファイルシステムツリーのどこにでも存在する可能性があります。
例えば、あなたのホームディレクトリに「dave-link」というシンボリックリンクがあり、それがファイルシステムのどこかにある「text-file.txt」というファイルを指しているとしましょう。シンボリックリンクで使用するコマンドは、自動的にそれが指すファイルに適用されます。もしあなたが使おうとすると
catまたは
less
シンボリックリンクを見れば、実際に「text-file.txt」ファイルの内容を見ることができます。
標準的なLinuxのインストールには多くのシンボリックリンクが含まれています。あなた自身が何も作成しなくても、オペレーティングシステムはそれらを使用します。アプリケーションのインストールルーチンは、実行可能ファイルを指し示すためにしばしばシンボリックリンクを使用します。ソフトウェアがアップデートされると、バイナリファイルは新しいバージョンに置き換えられ、すべてのシンボリックリンクは以前と同様に機能し続けます。新しいファイルの名前が古いものと同じであればです。
ルートディレクトリで ls を使うと、シンボリックリンクを簡単に確認できます。一部のエントリは異なる色で表示されます - 私たちのUbuntu 20.10テストマシンでは、それらは薄い青色で表示されます。
私たちは次のように入力します:
ls /詳細を見るために、-l(長いリスト表示)オプションを使用できます。すべての「lib」エントリと単一の「bin」エントリを見るために、次のコマンドを入力します:
ls -l /lib* /bin各行の先頭には「l」があります。これは、そのアイテムがシンボリックリンクであることを示しています。「->」の後のテキストは、シンボリックリンクが指している場所を示します。私たちの例では、ターゲットはすべてディレクトリです。
権限は、所有者、グループ、その他のために読み取り、書き込み、実行としてリストされています。これらはデフォルトの偽のエントリです。シンボリックリンクが指すオブジェクトの実際の権限を反映していません。優先されて尊重されるのは、ターゲットファイルまたはディレクトリの権限です。
壊れたシンボリックリンク
シンボリックリンクは、リンク先のファイルが削除されたり、別の場所に移動されたりすると壊れた(またはダングリング)状態になります。アプリケーションのアンインストールルーチンが正しく機能しない場合や、完了する前に中断された場合、壊れたシンボリックリンクが残ることがあります。
誰かがシンボリックリンクがそれを指していることを知らずに手動でファイルを削除すると、そのシンボリックリンクはもはや機能しません。それは、取り壊された町を指す道路標識のようなものになります。
現在のディレクトリに「hello」と呼ばれるシンボリックリンクを使用すると、この動作を簡単に見ることができます。次のように入力し、lsを使って見ることができます:
ls -lそれは「bin」と呼ばれるディレクトリにある「htg」と呼ばれるプログラムを指しています。シンボリックリンクを「実行」すると、私たちのためにプログラムが実行されます。
./helloこれが実際に起こっているかどうかを、プログラムを直接実行して確認できます:
../bin/htg予想通り、同じ反応が得られました。プログラムファイルを削除しましょう:
rm ../bin/htgさて、シンボリックリンクを見てみると、Linuxが壊れていることを知っているため、それが赤で表示されているのがわかります。また、それが以前どこを指していたのかも教えてくれるので、ファイルを置き換えたり、プログラムを再コンパイルしたり、シンボリックリンクを修復するために必要なことを行うことができます。
シンボリックリンクを実行しようとすると、取得するエラーはシンボリックリンクの名前に言及され、シンボリックリンクが指すプログラムの名前ではありません。
私たちは次のように入力します:
./hello壊れたシンボリックリンクを見つける
最新のバージョンのfindにはxtype(拡張タイプ)オプションがあり、壊れたシンボリックリンクを見つけるのが簡単になります。lフラグをxtypeと一緒に使用して、リンクを検索するように指示します。以下のようにfindとxtypeを使用すると、他のtypeフラグを使用せずにxtypeに壊れたリンクを返すよう強制することができます:
find . -xtype l
テスト用ホームディレクトリでコマンドを実行すると、いくつかの壊れたシンボリックリンクが見つかります。検索はデフォルトで再帰的であるため、すべてのサブディレクトリを自動的に検索します。
故意に壊した「hello」シンボリックリンクが予想通りリストに表示されています。他のシンボリックリンクの1つはFirefoxブラウザに関連しており、残りはスナップに関連しています。
出力を wc の -l (行数) オプションを使ってパイプすれば、行数をカウントでき、それは壊れたシンボリックリンクをカウントすることと同じです。
私たちは次のように入力します:
find . -xtype l | wc -l私たちは、何も指していない24の壊れたシンボリックリンクがあることを知らされました。
見つけて、レビューして、そして削除する
すべての壊れたシンボリックリンクを急いで削除する前に、find コマンドの結果を確認してください。壊れたシンボリックリンクのいずれかに正当な理由があるかどうかを確認してください。
場合によっては、シンボリックリンクが問題であり、ターゲットファイルではないことがあります。シンボリックリンクが不正に作成されていると、何も指さないことがありますが、実際のターゲットは存在しています。その場合、シンボリックリンクを再作成することが解決策となります。
明らかに壊れているシンボリックリンクが、ファイルのロックのインジケーターやその他の進行状況のインジケーターなど、別の目的で使用されている可能性もあります。Firefoxはこれを行います。それが私たちのリストの最初のシンボリックリンクです。ただし、Firefoxは私たちのテストマシンでは使用されていないので、安全に削除できます。
ターゲットが定期的にのみ存在する可能性もあり、これはその特定のソフトウェアの期待される(および望ましい)動作です。ターゲットファイルは別のマシンまたはクラウドからコピーされ、機能を果たした後に削除され、次のサイクルでは別のプログラムに置き換えられるかもしれません。
リンクの破損は、ソフトウェアのインストールが失敗したことの兆候である可能性もあります。その場合、シンボリックリンクを削除するのではなく、手動で修正するか、インストールを繰り返すべきです。
壊れたリンクを修正したら、検索を実行するためにコマンドを再実行してください。修正されたシンボリックリンクは、検索結果からは表示されないはずです。
安全のため、シンボリックリンクの削除は自分のディレクトリに限定するのが最良です。これらのコマンドをルートとして、またはシステムディレクトリで実行する際には、非常に注意してください。
壊れたシンボリックリンクの削除
-exec(実行)オプションは、findの検索結果に対してコマンドを実行します。私たちは、各壊れたシンボリックリンクを削除するためにrmを使用する予定です。{}文字列は、findによって発見されるたびに各壊れたシンボリックリンクの名前に置き換えられます。
私たちは、-execが実行するコマンドのリストを終了するためにセミコロン(;)を使用する必要があります。私たちは、セミコロンを「エスケープ」して、findコマンドの一部として扱われるようにするために、バックスラッシュ(\)を使用します。これによって、それはBashが処理すべきものではなくなります。
私たちは次のように入力します:
find . -xtype l -exec rm {} \;私たちは何も起こっていないことを示すことなくコマンドプロンプトに戻されました。壊れたリンクが削除されたことを確認するために、次のようにそれらを探すためのコマンドを繰り返します:
find . -xtype l一致する結果がないため、壊れたシンボリックリンクは削除されたことを意味します。
最初にレビューすることを忘れないでください
再度、コマンドを実行してシンボリックリンクを削除する前に、シンボリックリンクのリストを確認する時間を必ず取ってください。適切なディレクトリでシンボリックリンクを削除するコマンドを実行することで、確信が持てないものの削除を避けることができます。
たとえば、上記のように、「.snap」ディレクトリでコマンドを実行し、その後、孤立した「hello」シンボリックリンクを手作業で削除することができました。これにより、Firefoxのロックシンボリックリンクはそのまま残ることになります。







