Technology

Windows のシンボリックリンクの作成方法と使用例

Windowsでファイルやフォルダを管理する際、ショートカットでは「アプリが参照してくれない」「パスが変わってしまう」といった問題が起きることがあります。そこで役立つのが、システムやアプリ側に「そこにある」と思わせることができるシンボリックリンクです。本記事では、ショートカットとの決定的な違いから、Cドライブの容量節約といった具体的な活用シーンまで、その仕組みをシンプルに整理して解説します。

目次

シンボリックリンクとは?

シンボリックリンクは、ファイルやフォルダへの「分身」を作るような機能です。

最大の特徴は、「Windowsシステムやアプリに対して、実体が別の場所にあることを隠せる」という点にあります。通常のショートカットとシンボリックリンクの違いをイメージで表すと、以下のようになります。

項目違い
ショートカットショートカットは案内板です。人間がアイコンを見て「あっちに本物があるんだな」と判断してクリックするためのものです。しかし、アプリにとってはただの「リンク情報が書かれたファイル」でしかなく、その先にあるデータに直接触れることはできません。
シンボリックリンクシンボリックリンクは透明なトンネルです。アプリがその場所(リンク)へアクセスすると、自動的にリンク先へ繋がります。アプリ側は「自分がリンクを通ったこと」にすら気づかず、あたかもそこに実体があるかのようにデータを読み書きできます。

Windowsのリンク機能には、大きく分けて「ハードリンク」と「ソフトリンク」の2種類が存在します。シンボリックリンクはソフトリンクです。その違いを以下の表にまとめました。

内容ハードリンクソフトリンク
(シンボリックリンク/ジャンクション)
仕組み同じデータに別の名前をつけてアクセス別のリンクファイルを作成し、そこを経由してアクセス(「ここにあるデータはあちらにある」という参照情報だけを持つ)
本体削除時元ファイルを削除しても、ハードリンクの機能は失われないアクセス不可(リンク切れ)になる
ディスク消費消費されない消費されない
(管理情報のため、ごくわずか使用)
対象ファイルのみ(ディレクトリは不可シンボリックリンク:フォルダとファイルの両方
ジャンクション:フォルダのみ
場所の制限ハードリンクとリンク先のファイルは同じパーティション(Cドライブ等)内限定別ドライブやネットワーク越しでも可能(※)

(※) ジャンクションの場合、リンク先(ターゲット)にネットワークパスを指定することはできませんが、作成したジャンクションに対してネットワーク越しにアクセスすることは可能です。

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

Windows上でシンボリックリンクを作成するには、NTFS形式のドライブである必要があります。作成には原則として管理者権限が必要ですが、Windowsの「設定」から「開発者モード」を有効にすれば、一般ユーザー権限でも作成可能です。以下では、開発者モードが無効な環境を前提とした、コマンドプロンプトおよびPowerShellでの標準的な手順をまとめました。

コマンドプロンプト

管理者権限で開いたコマンドプロンプト上でmklinkコマンドを使用します。

管理者権限のコマンドプロンプトは、スタートボタンから「コマンドプロンプト」を探し、右クリックして表示される「管理者として実行」をクリックすることで起動できます。また、ショートカットを用いて、Win+Rボタンで「ファイル名を指定して実行」を開き、cmdと入力してctrl+shift+enterを押すことでも開くことができます。

コマンドプロンプトの開き方

mklinkコマンドのフォーマットは、以下となります。

mklink [オプション] [リンク名] [ターゲットパス]

[リンク名]には作成するリンクの名前を、[ターゲットパス]には既存のファイルやディレクトリのパスを設定します。オプションには次のものがあります。

オプション意味
なしファイルに対するシンボリックリンクを作成します。
/Dディレクトリに対するシンボリックリンクを作成します。
/Hファイルへのハードリンクを作成します。
/Jディレクトリへのジャンクションを作成します。

例えば、C:\test\program.exeという既存のファイルに対して、C:\test\link.exeという名前のシンボリックリンクを作成する場合には、以下のようにします。

mklink C:\test\link.exe C:\test\program.exe

なお、ジャンクションやハードリンクの作成には、開発者モードの設定に関わらず、管理者権限は不要です(ただし、作成先フォルダへの書き込み権限は必要です)。

PowerShell

PowerShellでシンボリックリンクを作成する場合には、管理者権限でPowershellを開き、New-Itemコマンドを用います。

管理者権限でPowershellを開くには、ショートカットを用いてWin+Rボタンで「ファイル名を指定して実行」を開き、powershellと入力してctrl+shift+enterを押すことで開くことができます。また、スタートボタンからコマンドプロンプトと同じように開くこともできます。

コマンドのフォーマットは以下のようになります。

New-Item -Type SymbolicLink -Path [リンク名] -Value [ターゲットパス]

例えば、先ほどの例と同じく C:\test\program.exe に対して、C:\test\link.exe というシンボリックリンクを作成する場合は、以下のように入力します。

New-Item -Type SymbolicLink -Path C:\test\link.exe -Value C:\test\program.exe

オプション-TypeSymbolicLinkを、JunctionHardLinkに変えることで、ジャンクションとハードリンクも作成できます。

なお、ジャンクションやハードリンクの作成には、開発者モードの設定に関わらず、管理者権限は不要です(ただし、作成先フォルダへの書き込み権限は必要です)。

パスにスペースが含まれる場合は、"C:\Target Path" のように全体をダブルクォーテーションで囲む必要があります。

開発者モードで「アクセスが拒否されました」と表示される場合
開発者モードは「シンボリックリンクを作成する権限」を付与するものであり、「フォルダへの書き込み権限」を無視できるものではありません。そのため、C:\ 直下や Program Files といったシステムによって保護されている領域にリンクを作成(書き込み)する場合は、引き続き管理者権限が必要になります。

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

シンボリックリンクの削除は、エクスプローラー上で通常のファイルやフォルダと同じ手順で行えます。リンク(アイコン)を削除しても、参照先の実体データが削除されることはありません。コマンドプロンプトで削除する場合は、対象に合わせて以下のコマンドを使用します。

ファイルへのリンクを削除する場合

del [リンク名]

フォルダへのリンク(またはジャンクション)を削除する場合

rmdir [リンク名]

rmdir コマンドをリンクに対して実行した場合、削除されるのは「リンク情報」のみです。リンク先のフォルダ(実体)の中身が消去されることはありません。

注意事項
ディレクトリ(フォルダ)のリンクを作成した場合、そのリンクを開いた状態で「中のファイル」を削除すると、実体データも削除されます。 削除したいのが「リンクという窓口」だけなのか、「中にあるデータ」なのかを必ず確認してください。

シンボリックリンクとショートカットの違い

シンボリックリンクとショートカットは、どちらも「別の場所にあるデータを開く」という点では同じに見えますが、内部的な挙動には決定的な違いがあります。

項目シンボリックリンクショートカット(.lnk
作業ディレクトリ実行しても「リンクがある場所」が作業ディレクトリに留まる実行すると、「リンク先のファイルがある場所」に作業ディレクトリが移動する
アプリからの見え方本物のフォルダ・ファイルに見える「.lnk」という名前のファイルに見える
パスの連続性フォルダへのリンク越しに中のファイルを指定できるフォルダへのリンク越しに中のファイルを指定できない

多くのプログラムは、実行時に「自分と同じフォルダ内にある設定ファイル」を読み込もうとします。

ショートカットの場合は、実行した瞬間に「実体がある場所」へ作業場所が移ってしまうため、プログラムは隣にあるはずの設定ファイルを見つけられず、エラーになることがあります。

シンボリックリンクの場合は、作業場所が移動せず、パス(住所)も変わりません。そのため、プログラムはリンクであることを意識せず、正常に動作を継続できます。

システムフォルダやアプリのインストール先を別ドライブに移動させる際、単なるショートカットではなくシンボリックリンク(またはジャンクション)が使われるのは、この「パスの連続性が保たれる(=アプリがエラーを起こさない)」という特性があるからです。

【検証】作業ディレクトリの取り扱い

シンボリックリンクはコマンドを実行したディレクトリが作業ディレクトリになるのに対して、ショートカットはリンク先のファイルがあるディレクトリが作業ディレクトリになります。このことを確認するために、次のバッチファイルを使用します。

@echo CD = %CD%

このバッチファイルは、作業ディレクトリ(カレントディレクトリ)を画面に表示する機能を持ちます。

2つのディレクトリ「tool」と「link」を作成し、上記のバッチファイルはディレクトリ「tool」に配置し、このバッチファイルに対するシンボリックリンクとショートカットはディレクトリ「link」に配置します。ここでは、例として「D:\test」ディレクトリ下にこれらの2つのディレクトリを作成します。ディレクトリ構造は、treeコマンドで表示すると、以下のようになります。

D:\TEST
├─link
│      echo_CD.bat      (シンボリックリンク)
│      echo_CD.bat.lnk  (ショートカット)
└─tool
        echo_CD.bat      (元のファイル)

ショートカットはファイルを右クリックして表示されるメニューの「ショートカットの作成」から作成し、シンボリックリンクは、次のコマンドで作成します。

cd D:\test\link
mklink echo_CD.bat D:\test\tool\echo_CD.bat

ディレクトリ「link」へ移動し、それぞれのリンクを実行した結果は以下の通りです。

シンボリックリンクを実行した場合:

D:\test\link> .\echo_CD.bat
CD = D:\test\link

ショートカットを実行した場合:

D:\test\link> .\echo_CD.bat.lnk
CD = D:\test\tool

これにより、シンボリックリンクはコマンドを実行したディレクトリ(link)が作業ディレクトリとなり、ショートカットはリンク先のファイルがあるディレクトリ(tool)が作業ディレクトリになっていることを確認できました。

【検証】ディレクトリリンク越しのファイルの実行

リンク先がディレクトリ(フォルダ)の場合、シンボリックリンクは「パスの一部」として機能するため、リンクフォルダを通って中のプログラムを実行できます。一方、ショートカットではフォルダの中までパスを通すことはできません。

この違いを確認するため、ディレクトリ「tool」の中にバッチファイルを置き、ディレクトリ「link」からアクセスできるかを検証します。ディレクトリ構造は、treeコマンドを用いて表示すると、以下のようになります。

D:\TEST
├─link
│  ├─ShortcutDir.lnk  (toolへのショートカット)
│  └─SymbolicDir      (toolへのシンボリックリンク)
│       echo_CD.bat  ← リンク越しに見えているファイル
└─tool
        echo_CD.bat    (実体ファイル)

ショートカットはファイルを右クリックして表示されるメニューの「ショートカットの作成」から作成し、シンボリックリンクは、以下のコマンドで作成します。

cd D:\test\link
mklink /D symbolicDir D:\test\tool

この状態で、ディレクトリ「link」内からそれぞれのリンクを経由してバッチファイルを実行した結果が以下となります。

シンボリックリンクを経由した場合:

D:\test\link> .\SymbolicDir\echo_CD.bat
CD = D:\test\link
(正常に実行される)

ショートカットを経由した場合:

D:\test\link> .\ShortcutDir.lnk\echo_CD.bat
ディレクトリ名が無効です。

D:\test\link> .\ShortcutDir\echo_CD.bat
指定されたパスが見つかりません。

検証の結果、シンボリックリンクはディレクトリへのリンクを通して中のプログラムを実行できますが、ショートカットでは不可能であることが分かります。

この違いは非常に重要です。例えば、CドライブにあるアプリのデータフォルダをHDD(Dドライブ)に移動させる際、ショートカットで代用するとアプリ側が「パスの先にあるファイル」を見つけられず、エラーが発生します。こうしたケースでは、シンボリックリンク(またはジャンクション)の使用が不可欠です。

シンボリックリンクとジャンクションの違い

シンボリックリンクとジャンクションはどちらもソフトリンクの一種ですが、ネットワーク環境での動作やパスの扱いに大きな違いがあります。

項目シンボリックリンクジャンクション
適用対象ファイルとフォルダの両方フォルダのみ
パス形式絶対・相対パスの両方が可能強制的に絶対パスに変換される
ネットワークネットワーク共有フォルダ(UNCパス)も可ローカルドライブのパスのみ(※1)
アクセス権限クライアント側(リンク元=リンクファイルの配置側)で判断サーバー側(リンク先=ターゲット)で判断

※1:ジャンクションそのものをネットワーク越しに共有することは可能ですが、リンク先(ターゲット)にネットワークパスを指定することはできません。

共有フォルダを介してアクセスする場合、リンク先がどこにあるかを探す作業(パスの解決)を誰が行うかによって、挙動が変わります。

シンボリックリンク(クライアント側で判断)では、アクセスしたPC(クライアント=リンク元)が「リンク先はどこか?」を解析します。そのため、クライアント自身がリンク先のフォルダに対して直接アクセス権限を持っていないと、データを開くことができません。

ジャンクション(サーバー側で判断)では、フォルダを共有しているPC(サーバー=リンク先)が、内部的にパスを解決してデータを転送します。クライアントからは通常のフォルダに見えるため、サーバー側で適切に処理されていれば、クライアントがリンク先の実体パスに対して個別に権限を持っていなくてもアクセスできる場合があります。

【検証】パス形式の違い

シンボリックリンクは、絶対パスと相対パスのどちらでも作成できますが、ジャンクションは、強制的に絶対パスに変換されます。例えば、ディレクトリ D:\test\ 内で、サブディレクトリ tool へのリンクを相対パスで作成してみます。

cd D:\test
mklink /J junction tool    ! ジャンクションの作成
mklink /D symbolic tool    ! シンボリックリンクの作成

作成後、ファイル一覧を表示する dir コマンドでリンク情報を確認します。

2021/06/01 06:24 DIR .
2021/06/01 06:24 DIR ..
2021/06/01 06:24 JUNCTION junction [D:\test\tool]
2021/06/01 06:24 SYMLINKD symbolic [tool]
2021/05/30 07:08 DIR tool

実行結果の [] 内を確認すると、ジャンクションは自動的に絶対パス(D:\test\tool)に書き換えられているのに対し、シンボリックリンクは指定した通りの相対パス(tool)として保持されていることが分かります。

この違いにより、相対パスで作成されたシンボリックリンクは、親フォルダ(この例では test フォルダ)を丸ごと別のドライブやフォルダへ移動させても、中にあるリンク構造が壊れません。一方、絶対パスで記録されるジャンクションは、移動先でも元のパス(D:\test\tool)を参照し続けるため、環境が変わるとリンク切れを起こす可能性があります。

【補足】接続先PCでリンクが使用されている場合のアクセス権限

シンボリックリンクはクライアント側(リンク元=リンクファイルの配置側)でアクセス権が判断されますが、ジャンクションはサーバー側(リンク先=ターゲット)でアクセス権が判断されます。

例えば、パソコン1(クライアント側=リンク元)とパソコン2(サーバー側=リンク先)があり、パソコン2に次の2つのディレクトリがあるとします。

  • フォルダA(共有フォルダ)
  • フォルダB(非共有フォルダ)

パソコン1は、パソコン2の共有フォルダであるフォルダAにのみアクセスできるとします。このフォルダAの中に、フォルダB(実体)へのリンクを置いた場合の挙動は以下の通りです。

リンクの種類アクセス権の判断主体説明
シンボリックリンククライアント側(リンク元)パソコン1(クライアント側=リンク元)が、自分自身に「フォルダBへのアクセス権」があるかを判断します。しかし、フォルダBは共有されていないため、パソコン1には権限がないと判断され、パソコン1はフォルダBにはアクセスできません。
ジャンクションサーバー側(リンク先)パソコン2(サーバー側=リンク先)が、自分自身に「フォルダBへのアクセス権」があるかを判断します。パソコン2は自らのフォルダであるフォルダBに当然アクセスできるため、そのデータをパソコン1へ渡します。結果として、パソコン1はフォルダBにアクセスが可能になります。

シンボリックリンクの実践的な活用シーン

シンボリックリンクの具体的な使用例を示します。

SSD(Cドライブ)の空き容量を確保する

パソコンの構成で「CドライブがSSD、Dドライブがハードディスク(HDD)」となっているケースは一般的です。SSDは読み書きが非常に高速ですが、データの書き込み総量(TBW)に上限があり、寿命があるという特性を持っています。また、万が一故障した際のデータ復元がHDDよりも困難であるという点も注意が必要です。

このため、SSD(Cドライブ)の容量不足を防ぎ、寿命を延ばす目的で、頻繁にデータを保存する「ダウンロード」や「ドキュメント」などのフォルダ実体をHDD(Dドライブ)に逃がし、シンボリックリンクでつなぐ方法が有効です。

具体的な手順として、ダウンロードフォルダをDドライブに移動することを考えます。例として、C:\Users\user_name\Downloads フォルダ(user_nameはご自身のユーザー名になります)をDドライブへ移動する場合の手順は以下の通りです。

手順1:フォルダの移動
エクスプローラー上で「ダウンロード」フォルダを切り取りD:\Users\user_name\ の中に貼り付けます。この操作により、Cドライブから元の「Downloads」フォルダが消え、Dドライブに実体(リンク先)が作成された状態になります。

手順2:シンボリックリンクの作成
管理者権限のコマンドプロンプトで以下のコマンドを実行します。

mklink /D C:\Users\user_name\Downloads D:\Users\user_name\Downloads

コマンド上では、日本語名の「ダウンロード」ではなく英語名の 「Downloads」 と入力する必要があります。また、Cドライブ側に元のフォルダが残っていると「既にファイルが存在します」というエラーが出るため、手順1「フォルダの移動」で、フォルダを移動(または削除)させてから実行してください。

ブラウザ等でファイルをダウンロードした際、エクスプローラーの「ダウンロード」フォルダからアクセスでき、かつ実体がDドライブ内に保存されていれば成功です。

Windows 10/11の標準機能について
現在のWindowsでは、フォルダのプロパティにある「場所」タブの「移動」ボタンから、同様の操作が簡単に行えるようになっています。この方法を使えば、コマンドを入力することなく、システムが自動的にパスの整合性を保ってくれます。

環境変数の文字列制限(2048文字)の回避

Windowsの環境変数、特に「PATH」には文字数制限があり、あまりに多くのソフトウェアをインストールすると、PATHが長すぎて「この環境変数は大きすぎます」というエラーが出て、新しいソフトがインストールできなくなることがあります。

多くのソフトウェアは C:\Program FilesC:\Program Files (x86) 内にインストールされるため、パスの中にこれらの長い文字列が何度も登場することが原因です。

この問題に対し、シンボリックリンクを「短い別名(エイリアス)」として作成することで、PATH全体の文字数を大幅に節約できます。

具体的な手順ですが、まず管理者権限のコマンドプロンプトで、長いシステムフォルダに対する短い名前のリンクを作成します。

mklink /D C:\P86 "C:\Program Files (x86)"
mklink /D C:\P "C:\Program Files"

次に、システム環境変数「PATH」の設定画面を開き、登録されているパスを書き換えます。

修正前: C:\Program Files\Common Files\Oracle\Java\javapath;...
修正後: C:\P\Common Files\Oracle\Java\javapath;...

このように、C:\Program Files の部分を C:\P に置き換えることで、1箇所につき11文字(14文字→3文字)を削減できます。PATH内に該当するパスが多いほど、大きな空き容量を確保できます。

注意事項
実体のフォルダ名は変更しないでください。元の Program Files フォルダの名前を変更しようとすると、システムが正常に動作しなくなります。あくまで「短い名前のリンク(窓口)」を新しく作るだけに留めてください。また、作成した C:\P などのリンクを誤って削除すると、PATHにそれを利用しているすべてのソフトウェアが起動できなくなります。

出力ファイルをネットワークドライブに書き出す

プログラムの出力先フォルダが固定されている場合に、その出力ファイルをネットワーク上に書き出したいときは、出力フォルダを同じ名前のシンボリックリンクに置き換えることで対応可能です。

ネットワークドライブへのリンク作成には、注意が必要です。 コマンドプロンプト(cmd)はUNCパス(\\サーバー名(あるいはIPアドレス)\フォルダ名)の扱いが制限されているため、以下のいずれかの方法で行います。

方法1:PowerShellを使用する
PowerShellはUNCパスを標準でサポートしているため、管理者権限で以下のコマンドを実行します。

New-Item -Type SymbolicLink -Path "リンク名" -Value "\\サーバー名\ディレクトリ名"

方法2:ネットワークドライブを割り当てる(推奨)
最も確実でエラーが少ない方法は、一度ネットワークドライブ(Z:など)を割り当ててからリンクを張ることです。エクスプローラーで共有フォルダを右クリックし、「ネットワークドライブの割り当て」で Zドライブ などに設定します。

ネットワークドライブの割り当て

管理者権限のコマンドプロンプトで、そのドライブ(この例では、Zドライブ)に対してリンクを作成します。

mklink /D "リンク名" "Z:\ディレクトリ名"

開発フォルダと作業フォルダを分離する

プログラム開発において、ソースコードやコンパイル中の中間ファイルが生成される「開発フォルダ」と、実際にプログラムを動かす「作業フォルダ(実行用)」を分離すると、環境を非常にすっきりと保つことができます。

このとき、作業フォルダ内に、ビルドされた実行ファイル(.exe など)へのシンボリックリンクを作成することで、以下のようなメリットが得られます。

常に最新の状態で実行できる
一度リンクを張っておけば、プログラムを再コンパイルするだけで、作業フォルダ側のリンク先も自動的に最新の実行ファイルを参照します。

開発環境(ソースフォルダ)が汚れない
プログラムが生成するログファイルや一時ファイルは、リンクを実行した場所(作業フォルダ)に出力されます。これにより、ソースコードの中に実行時のゴミが混ざるのを防げます。

Gitなどの管理が楽になる
実行時に生成される「出力データ」が別フォルダに隔離されるため、バージョン管理システム(Gitなど)で、誤って不要な出力ファイルをコミットしてしまうミスを減らせます。

プログラムは通常「自分が今いる場所(カレントディレクトリ)」を基準にファイルを作成します。シンボリックリンク経由で実行しても、実行時の場所は「作業フォルダ」であるため、出力ファイルもその場に生成されるという性質をうまく利用しています。好みの問題もありますが、大規模な開発や、頻繁に出力ファイルが生成されるプログラムを作成する場合には、この分離が非常に便利です。

まとめ

以上、シンボリックリンクとジャンクションの作成方法やメリット、活用例についてご紹介しました。シンボリックリンクは単なる「近道(ショートカット)」ではなく、システム側に「実体がそこにある」と思い込ませる高度な機能です。特にネットワーク共有でのアクセス権限の挙動や、ストレージの整理、開発環境の構築において、シンボリックリンクとジャンクションの特性の違いを正しく使い分けることで、PCの運用効率と利便性は飛躍的に向上します。

-Technology
-