原文: Symlink Tutorial in Linux – How to Create and Remove a Symbolic Link

シンボリックリンクとは、Linux においてコンピューター上にある他のファイルやフォルダを指し示す働きを持つファイルです。英語では symlink とも呼ばれ、Windows におけるショートカットとよく似ています。

Linux/UNIX OS のリンクの種類として、ハードリンクに対してシンボリックリンクを「ソフトリンク」と呼ぶ人もいます。

ソフトリンクとハードリンクの違い

ソフトリンクはショートカットとよく似ており、任意のファイルシステム上にある他のファイルやディレクトリを指し示します。

ハードリンクも同様に、ファイルやフォルダを指すショートカットではありますが、異なるファイルシステム上にあるファイルやフォルダを指すことはできません。

では、シンボリックリンクを作成、解除する手順を見ていきましょう。またリンク切れとはどういう状態かと、それを削除する方法も解説します。

シンボリックリンクの作成方法

シンボリックリンクを作成する構文は次のとおりです。

ln -s <リンク対象のファイルまたはフォルダのパス> <作成するリンクのパス>

ln がリンクのコマンドです。-s フラグはソフトリンクを作成するように指定します。-s の代わりに -symbolic と入力しても構いません。

デフォルトでは、ln コマンドはハードリンクを作成します。その次の引数は「リンクしたい対象のファイルまたはフォルダのパス」です。(つまりショートカットを作成したいファイルまたはフォルダです。)

そして最後の引数は「作成するリンク (ショートカット) 自体のパス」です。

ファイルへのシンボリックリンクの作成方法 (コマンド例)

ln -s /home/james/transactions.txt trans.txt

上記のコマンドを実行すると、trans.txt/home/james/transactions.txt にアクセスできるようになります。trans.txt に加えた変更はすべてオリジナルのファイルにも反映されます。

上記のコマンドでは、リンクファイル trans.txt がカレントディレクトリに作成されることに注意してください。次のようにしてリンクファイルをフォルダ内に作成することもできます。

ln -s /home/james/transactions.txt my-stuffs/trans.txt

この場合、my-stuffs という名前のディレクトリがすでにカレントディレクトリになければなりません。該当するディレクトリがない場合はエラーが発生します。

フォルダへのシンボリックリンクの作成方法 (コマンド例)

上記と同様に、次のコマンドを使用します。

ln -s /home/james james

このコマンドは、james という名前のシンボリックリンクフォルダを作成します。ここには /home/james の中身が含まれます。このリンクフォルダでの変更はすべてオリジナルのフォルダにも反映されます。

シンボリックリンクの削除方法

意図せず元ファイルを削除してしまわないように、シンボリックリンクを削除する前にはそのファイル / フォルダが本当にシンボリックリンクかどうか確認したいのではないかと思います。

確認方法の一例がこちらです。

ls -l <シンボリックリンクと思われるファイルのパス>

ターミナルでこのコマンドを実行すると、指定したファイルのプロパティが表示されます。実行結果の一文字目が小文字の L ('l') で始まっていれば、そのファイル / フォルダはシンボリックリンクです。

また、行の終わりに矢印 (->) と、シンボリックリンクが指す先のファイル / フォルダも表示されます。

シンボリックリンクを削除する方法は二種類あります。

構文は次の通りです。

unlink <シンボリックリンクのパス>

この処理が成功すると、シンボリックリンクが削除されます。

シンボリックリンクがフォルダを指している場合でも、'/' は付けないようにしてください。'/' を付けると Linux が対象のパスをディレクトリとみなしてしまいますが、unlink はディレクトリを削除できないためです。

rm を使用してシンボリックリンクを削除する方法

ここまで見てきたように、シンボリックリンクは元ファイル (フォルダ) を指し示す単なるファイル (フォルダ) です。その関係を解除するには、リンクファイルを削除すれば良いのです。

つまり、構文は次の通りです。

rm <シンボリックリンクのパス>

例:

rm trans.txt
rm james

ただし rm james/ と実行するとエラーが発生するので注意してください。これは Linux が 'james/' をディレクトリとみなしてしまい、ディレクトリを削除するには rf などのオプションが必要になるためです。しかしこれは私たちが実行したい処理内容ではありません。シンボリックリンクはフォルダを指しているかもしれませんが、ここで削除したいのは名前だけです。

unlink ではなく rm を使う利点は、通常のファイルを削除する場合と同じように、複数のシンボリックリンクを一度に削除できることです。

リンク切れの検出、削除方法

シンボリックリンクが指している先のファイルやフォルダが削除されたり、パスが変更されたりすると、リンク切れが発生します。

例えば 'transactions.txt' が /home/james から /home/james/personal に移動されると、先ほど作成した 'trans.txt' のリンクが壊れてしまいます。そしてこのリンクにアクセスしようとすると 'No such file or directory' というエラーが発生します。このリンクの中身が存在しないためです。

リンク切れを見つけた場合、リンクファイルは簡単に削除できます。壊れたシンボリックリンクは次のコマンドで見つけることができます。

find /home/james -xtype l

このコマンドは、james ディレクトリ内 (ファイル、ディレクトリ、サブディレクトリ) にある壊れたシンボリックリンクを一覧表示します。

次のように -delete オプションを渡すと、そのリンクが削除されます。

find /home/james -xtype l -delete

まとめ

シンボリックリンクは Linux/UNIX OS の興味深い機能です。

そのままではアクセスし辛いファイルやフォルダを参照しやすくするために、使いやすいシンボリックリンクを作成することができます。使い慣れてくると、どのように機能するか直観的に理解できるようになり、ファイルシステムを効率よく管理できるようになるでしょう。