WindowsのリンクとLinuxのリンク

WindowsにもLinuxにもリンクと呼ばれる機能がある。これはファイルやディレクトリ/フォルダに対してリンクを張るという機能で、Windowsであればショートカット、ハードリンク、シンボリックリンク、ジャンクションといった種類がある。Linuxならシンボリックリンクとハードリンクがある。これらの機能はファイルシステムに依存しているため、ファイルシステムによってはほかのリンク機能も利用できる。

WindowsとLinuxのリンクはどれもよく似ているのだが、微妙に動きが違っている。今回はこのリンクの違いを紹介しよう。

Windowsのリンク

Windows 10でファイルおよびフォルダに対してリンク(ショートカット、シンボリックリンク、ハードリンク、ジャンクション)をそれぞれ張った場合にファイルエクスプローラで閲覧したものが次のスクリーンショットだ。

  • ショートカット、シンボリックリンク、ハードリンク、ジャンクションをファイルエクスプローラで一覧表示した場合のサンプル

    ショートカット、シンボリックリンク、ハードリンク、ジャンクションをファイルエクスプローラで一覧表示した場合のサンプル

多くのWindowsユーザーはショートカットしか使わない、または、ショートカットしか知らないんじゃないかと思う。ショートカットは次のようにファイルエクスプローラから作成することが可能で、アプリケーションの起動目的や特定のフォルダまたはファイルへの短縮アクセスを目的としてデスクトップにショートカットを置いておくことが多いだろう。

  • ファイルエクスプローラからショートカットを作成できる

    ファイルエクスプローラからショートカットを作成できる

一方、シンボリックリンク、ハードリンク、ジャンクションはコマンドプロンプトからmklinkというコマンドを使って作成する。主な使い方は次のとおりだ。

  • コマンドプロンプトからmklinkコマンドを実行する

    コマンドプロンプトからmklinkコマンドを実行する

コマンド 内容
mklink リンクパス ファイルパス ファイルにシンボリックリンクを作成
mklink /h リンクパス ファイルパス ファイルにハードリンクを作成
mklink /d リンクパス フォルダパス フォルダにシンボリックリンクを作成
mklink /j リンクパス フォルダパス フォルダにジャンクションを作成

まず、ハードリンクと、ショートカット/シンボリックリンク/ジャンクションといったように2つに分けて考えるのがよいだろう。ハードリンクは同一ファイルシステム内でのみ作成可能で、かつ、ファイルに対してのみしか作成できない。ハードリンクはリンクという名前が付いているものの、実体が同じという特徴がある。例えば、Aに対してBというハードリンクを作成したとする。この場合、AもBも同じデータを指していて違いがない。見た目上はデータにアクセスするためにファイル名が2つに増えたように見える。

これに対し、ショートカット/シンボリックリンク/ジャンクションには、リンク先とは別に実体がある。ショートカット/シンボリックリンク/ジャンクションは似ているものの、動作に細かな違いがある。それぞれの動作を表にまとめると次のようになる。

リンクの種類 内容
ハードリンク 同一ファイルシステム内のファイルに対してのみ作成可能。元のファイルとハードリンクされたファイルは同一のファイルであり差はない。ハードリンクの作成はデータにアクセスする名前を増やす作業とも言える
シンボリックリンク ファイルに対してもフォルダに対しても作成可能。ファイルの場合は元ファイルへアクセス、フォルダの場合、フォルダ名はシンボリックリンク名のまま元のフォルダの内容へアクセス。作成するには管理者権限が必要
ジャンクション フォルダに対して作成可能。フォルダ名はジャンクション名のまま元のフォルダの内容へアクセス
ショートカット ファイルに対してもフォルダに対しても作成可能。ファイルもフォルダも元ファイルへのアクセス

説明を読んでもよくわからないと思うので、次の実行例を見ていただきたい。レッドのテキストが実際に開いたもの、タイトルバーやアドレスバーに表示されているものが認識されている対象だ。この動作を見ると、それぞれがどのような動作をするものかわかってもらえるのではないだろうか。

  • ファイルを開けば、そのままファイルが開かれる

    ファイルを開けば、そのままファイルが開かれる

  • ハードリンクを開くと、名前はハードリンク名のままだが、当然中身は同じ。元ファイルもハードリンクも差はない

    ハードリンクを開くと、名前はハードリンク名のままだが、当然中身は同じ。元ファイルもハードリンクも差はない

  • シンボリックリンクを開くと、指し示している元のファイルの方が開かれる

    シンボリックリンクを開くと、示している元のファイルが開かれる

  • ショートカットを開くと、指し示している元のファイルの方が開かれる

    ショートカットを開くと、示している元のファイルが開かれる

  • フォルダへの移動は、そのままフォルダへの移動となる

    フォルダへの移動は、そのままフォルダへの移動となる

  • ジャンクションへの移動は、指し示しているフォルダへの移動になるものの、パス名にはジャンクション名が使われる

    ジャンクションへの移動は、示しているフォルダへの移動になるが、パス名にはジャンクション名が使われる

  • シンボリックリンクの移動は、指し示しているフォルダへの移動になるものの、パス名にはシンボリックリンク名が使われる

    シンボリックリンクの移動は、示しているフォルダへの移動になるが、パス名にはシンボリックリンク名が使われる

  • ショートカットへの移動は、指し示している元のフォルダへの移動となる

    ショートカットへの移動は、示している元のフォルダへの移動となる

なお、ここまでの説明がよくわからないとしても問題はない。ほとんどのユーザーはショートカットしか使わないと思うので、ショートカットの動作だけ理解しておけばよいだろう。なお、Windowsにおいてシンボリックリンクを作成するには、管理者権限が必要であるなど、多少利用の敷居が高い。

Linuxのリンク

Windowsと比べるとLinuxのリンクはシンプルだ。ハードリンクとシンボリックリンクしかない。それぞれlnコマンドを使って次のように作成する。Windowsコマンドプロンプトのmklinkとは引数の順序が逆である点に注意しておきたい。

コマンド 内容
ln ファイルパス リンクパス ファイルにハードリンクを作成
ln -s ファイルパス リンクパス ファイルにシンボリックリンクを作成
ln -s ディレクトリパス リンクパス ディレクトリにシンボリックリンクを作成

ハードリンクとシンボリックリンクの動作はWindowsのハードリンクとシンボリックリンクの動作に似ているが、シンボリックリンクは微妙に作りが異なっている。概要をまとめると次のようになる。

リンクの種類 内容
ハードリンク 同一ファイルシステム内のファイルに対してのみ作成可能。元のファイルとハードリンクされたファイルは同一のファイルであり差はない。ハードリンクの作成はデータにアクセスする名前を増やす作業とも言える
シンボリックリンク ファイルに対してもディレクトリに対しても作成可能。シンボリックリンクそのものを指すかシンボリックリンクの指す先を利用するかは、このファイルを利用するコマンドやアプリケーションがどのように利用するかによって変わる

今一つ説明がよくわからないという場合、WindowsのショートカットとLinuxのシンボリックリンクは結構似ているということをまず覚えておいてもらえればと思う。

WindowsとLinuxのリンクの違い

Windowsのショートカット、シンボリックリンク、ジャンクションと、Linuxのシンボリックリンクは何が違うのかということになるが、わかりやすい指針として、挙動がすでに決まっているかアプリケーションに依存しているか、と考えておくとよいかもしれない(その限りではないのだが、一応の指針として)。

Windowsにはショートカット、シンボリックリンク、ジャンクションという3つの種類が用意されている。そして、それぞれに動作が異なっている。一方、Linuxにはシンボリックリンクしかないが、それをどう扱うかはコマンドやアプリケーション側で変えることができ、オプションなどで挙動が変更できるようになっていることが多い。本質的にそれほど違いがある機能ではないのだが、こんな感じの違いがあるということを知っておくとよいかもしれない。