Linuxで壊れたシンボリックリンクを見つけて削除する方法

公開: 2022-01-29
Linuxラップトップのターミナルウィンドウ。
Fatmawati Achmad Zaenuri / Shutterstock

Linuxのシンボリックリンクは素晴らしい機能ですが、壊れて何も指さないままになる可能性があります。 壊れたシンボリックリンクを見つけて確認し、必要に応じてシステムから削除する方法は次のとおりです。

シンボリックリンク101

「ソフトリンク」および「シンボリックリンク」とも呼ばれるシンボリックリンクは、ファイルおよびディレクトリを指すことができるショートカットの形式です。 シンボリックリンクは、ファイルマネージャウィンドウの通常のファイルまたはディレクトリと同じように見えます。 また、ターミナルウィンドウのファイルリストにエントリとして表示されます。 シンボリックリンクが指すファイルまたはディレクトリは、ファイルシステムツリーのどこにあってもかまいません。

たとえば、ホームディレクトリに「dave-link」というシンボリックリンクがあり、ファイルシステムツリーの別の場所にある「text-file.txt」というファイルを指しているとします。 シンボリックリンクで使用するコマンドは、シンボリックリンクが指すファイルに自動的に適用されます。 シンボリックリンクでcat lessを使用しようとすると、実際には「text-file.txt」ファイルの内容が表示されます。

標準のLinuxインストールには、多くのシンボリックリンクが含まれています。 自分で作成しなくても、オペレーティングシステムはそれらを使用します。 アプリケーションのインストールルーチンは、多くの場合、実行可能ファイルを指すためにシンボリックリンクを使用します。 ソフトウェアが更新されると、バイナリファイルは新しいバージョンに置き換えられ、新しいファイルの名前が古いファイルと同じである限り、すべてのシンボリックリンクは以前と同じように機能し続けます。

ルートディレクトリのlsを使用すると、いくつかのシンボリックリンクを簡単に確認できます。 一部のエントリは異なる色で表示されます。Ubuntu20.10テストマシンでは、水色で表示されます。

次のように入力します。

 ls / 

広告

-l (ロングリスト)オプションを使用すると、より詳細に調べることができます。 次のコマンドを入力して、すべての「lib」エントリと単一の「bin」エントリを確認します。

 ls -l / lib * / bin 

各行の先頭には「l」があり、アイテムがシンボリックリンクであることを示します。 「->」の後のテキストは、シンボリックリンクが指しているものを示しています。 この例では、ターゲットはすべてディレクトリです。

所有者、グループ、およびその他の権限は、読み取り、書き込み、および実行として一覧表示されます。 これらはデフォルトの偽のエントリです。 これらは、シンボリックリンクが指すオブジェクトに対する実際のアクセス許可を反映していません。 優先され、ファイルシステムによって尊重されるのは、ターゲットファイルまたはディレクトリに対するアクセス許可です。

壊れたシンボリックリンク

シンボリックリンクが指しているファイルが削除されるか、別の場所に移動されると、シンボリックリンクが壊れます(またはぶら下がったままになります)。 アプリケーションのアンインストールルーチンが正しく機能しない場合、またはアプリケーションが完了する前に中断された場合は、シンボリックリンクが壊れたままになる可能性があります。

シンボリックリンクがファイルを指していることを知らずに誰かが手動でファイルを削除すると、それらのシンボリックリンクは機能しなくなります。 それらは、強盗された町を指す道路標識のようになります。

この動作は、現在のディレクトリにある「hello」というシンボリックリンクを使用して簡単に確認できます。 lsを使用して次のように入力します。

 ls -l
広告

これは、「bin」というディレクトリにある「htg」というプログラムを指します。 シンボリックリンクを「実行」すると、プログラムが実行されます。

 。/こんにちは

これで、プログラムを直接実行することで、これが起こっているかどうかを確認できます。

 ../bin/htg

予想どおり、同じ応答が得られます。 プログラムファイルを削除しましょう:

 rm ../bin/htg

さて、シンボリックリンクを見ると、Linuxはそれが壊れていることを知っているので、赤でリストされていることがわかります。 また、以前のポイントを示しているため、ファイルを置き換えたり、プログラムを再コンパイルしたり、シンボリックリンクを修復するために必要なことを実行したりできます。

シンボリックリンクを実行しようとすると、発生するエラーは、シンボリックリンクが指すプログラムの名前ではなく、シンボリックリンク名を参照していることに注意してください。

次のように入力します。

 。/こんにちは

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

最新バージョンのfindにはxtype (拡張タイプ)オプションがあり、壊れたシンボリックリンクの検索が簡単になります。 xtypelフラグを使用して、リンクを検索するように指示します。 次のようにfindxtypeを使用し、他のtypeフラグを使用せずに、 xtypeに壊れたリンクを返すように強制します。

 探す 。 -xtype l 

テストホームディレクトリでコマンドを実行すると、かなりの数の壊れたシンボリックリンクが見つかります。 検索はデフォルトで再帰的であるため、すべてのサブディレクトリが自動的に検索されることに注意してください。

予想どおり、意図的に解除した「hello」シンボリックリンクが一覧表示されます。 他のシンボリックリンクの1つはFirefoxブラウザーに関連しており、残りはスナップに関連付けられています。

-l (lines)オプションを指定して出力をwcにパイプすると、行をカウントできます。これは、壊れたシンボリックリンクをカウントするのと同じです。

次のように入力します。

 探す 。 -xtype l | wc -l 

何も指していないシンボリックリンクが24個あると通知されました。

検索、確認、削除

急いで壊れたシンボリックリンクをすべて削除する前に、 findコマンドの結果を確認してください。 壊れたシンボリックリンクのいずれかに正当な理由があるかどうかを確認します。

場合によっては、ターゲットファイルではなく、シンボリックリンクが問題になることがあります。 シンボリックリンクが正しく作成されていない場合は、何も指していない可能性がありますが、実際のターゲットは存在します。 その場合、シンボリックリンクを再作成することで修正できます。

明らかに壊れたシンボリックリンクが、ファイルロックのインジケーターやその他のgo / no goインジケーターなど、他の何かとして使用されている可能性もあります。 Firefoxはこれを行います。 それが私たちのリストの最初のシンボリックリンクです。 ただし、Firefoxはテストマシンでは使用されていないため、削除しても安全です。

広告

ターゲットが定期的にのみ存在する可能性もあります。これは、その特定のソフトウェアの予想される(そして望ましい)動作です。 ターゲットファイルが別のマシンまたはクラウドからコピーされ、その機能を実行してから再度削除され、次のサイクルで別のプログラムに置き換えられる可能性があります。

壊れたシンボリックリンクは、ソフトウェアのインストールが失敗したことの兆候である可能性もあります。 その場合、シンボリックリンクを削除する代わりに、手動で修正するか、インストールを繰り返す必要があります。

保持する必要のある壊れたリンクを修正したら、コマンドを繰り返して検索を実行します。 その場合、固定シンボリックリンクは検索結果に表示されないはずです。

安全のために、シンボリックリンクの削除を自分のディレクトリに制限することをお勧めします。 これらのコマンドをrootとして、またはシステムディレクトリで実行する場合は十分に注意してください。

壊れたシンボリックリンクの削除

-exec (execute)オプションは、検索結果のfindでコマンドを実行します。 rmを使用して、壊れた各シンボリックリンクを削除します。 {}文字列は、 findによって検出されるため、壊れたシンボリックリンクの名前に置き換えられます。

-execで実行するコマンドのリストを終了するには、セミコロン( ; )を使用する必要があります。 バックスラッシュ( \ )を使用してセミコロンを「エスケープ」するため、 Bashが実行する必要があるものではなく、 findコマンドの一部として扱われます。

次のように入力します。

 探す 。 -xtype l -exec rm {} \; 

広告

何かが起こったことを示すことなく、コマンドプロンプトに戻ります。 壊れたリンクが削除されたことを確認するには、次のようにコマンドを繰り返してリンクを探します。

 探す 。 -xtype l 

一致する結果はありません。つまり、壊れたシンボリックリンクが削除されています。

最初に確認することを忘れないでください

繰り返しになりますが、コマンドを実行してシンボリックリンクを削除する前に、必ず時間をかけてシンボリックリンクのリストを確認してください。 コマンドを実行して適切なディレクトリにあるものを削除することにより、不明な点を削除することを回避できます。

たとえば、上記では、「。snap」ディレクトリでコマンドを実行してから、単独の「hello」シンボリックリンクを手動で削除することができます。 これにより、Firefoxのロックシンボリックリンクは変更されませんでした。