TECHNOLOGY

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

Windowsでファイルやフォルダを管理する際、ショートカットだけでは不十分なケースがあります。そこで役立つのがシンボリックリンクです。本記事では、その仕組みと具体的な使い方を解説します。

目次

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

シンボリックリンクは、ファイルやフォルダーへのショートカットのように、ある場所にあるファイルやフォルダーを別の場所から参照することができる機能です。Windowsには、ハードリンクとソフトリンクがありますが、シンボリックリンクはソフトリンクの一種です。ハードリンクとソフトリンクの違いを以下に示します。

内容ハードリンクソフトリンク
(シンボリックリンク/ジャンクション)
仕組み同じデータに別の名前をつけてアクセス別のリンクファイルを作成し、そこを経由してアクセス
本体削除時元ファイルを削除しても、ハードリンクの機能は失われないアクセス不可(リンク切れ)になる
ディスク消費消費されない消費されない
対象ファイルのみ(ディレクトリは不可)シンボリックリンク:フォルダとファイルの両方
ジャンクション:フォルダのみ
場所の制限ハードリンクとリンク先のファイルは同じパーティション(Cドライブ等)内限定別のドライブやネットワークも可能(後述)

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

Windows上でシンボリックリンクを作成できるのは、NTFSフォーマットのドライブ上で、作成には管理者権限が必要です。ここでは、コマンドプロンプトで作成する方法とPowerShellで作成する方法を説明します。

コマンドプロンプト

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

管理者権限のコマンドプロンプトは、スタートボタンから「コマンドプロンプト」を探し、右クリックして表示される「管理者として実行」をクリックすることで起動できます。

また、Win+Rボタンで「ファイル名を指定して実行」を開き、cmdと入力してctrl+shift+enterを押すことでも開くことができます。

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

mklinkコマンドのフォーマットは、

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

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

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

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

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

とします。

ジャンクションとハードリンクの作成は管理者権限である必要はありません。

PowerShell

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

管理者権限でPowershellを開くには、Win+Rボタンで「ファイル名を指定して実行」を開き、powershellと入力してctrl+shift+enterを押すことで開くことができます。

また、スタートボタンからコマンドプロンプトと同じように開くこともできます。

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

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

ジャンクションとハードリンクの作成は管理者権限である必要はありません。

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

エクスプローラーから通常のファイルと同じ方法で削除できます。リンクを削除しても、ターゲット側の実体データが削除されることはありませんが、ディレクトリへのリンクの中に入ってファイルを削除すれば元データが消える点には注意が必要です。

コマンドを用いてファイルへのリンクを削除する場合には、

del [ファイル名]

を使用し、フォルダへのリンクを削除する場合には、

rmdir [フォルダ名]

を使用します。

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

シンボリックリンクとショートカットは一見同じに見えますが、「作業ディレクトリ」と「ディレクトリリンク越しのファイル実行の可否」の扱いに決定的な違いがあります。具体的には次の違いがあります。

項目シンボリックリンクショートカット(.link
作業ディレクトリ実行しても「リンクがある場所」が作業ディレクトリに留まる実行すると、「リンク先のファイルがある場所」に作業ディレクトリが移動
ディレクトリリンク越しのファイル実行可能不可

プログラムから見て「同じフォルダ内の設定ファイルを読み込む」といった動作をする場合、ショートカットではパスがずれてエラーになりますが、シンボリックリンクなら問題なく動作します。これが、システムフォルダを別ドライブに流す際にシンボリックリンクが選ばれる理由です。

[検証]作業ディレクトリ

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

このことを確認するために、次のバッチファイルを使用します。

@echo CD = %CD%

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

2つのディレクトリ「tool」と「link」を作成し、上記のバッチファイルはディレクトリ「tool」に配置し、このバッチファイルに対するシンボリックリンクとショートカットはディレクトリ「link」に配置します。

ここでは、例として「D:\test」ディレクトリ下にこれらの2つのディレクトリを作成します。ディレクトリ構造は、treeコマンドで表示すると、

D:\TEST
+---link 
|        echo_CD.bat       ! Symbolic Link 
|        echo_CD.bat.lnk   ! Shortcut 
\---tool     
         echo_CD.bat       ! Original file

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

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」に「tool」へのショートカットとシンボリックリンクを作成します。

ディレクトリ構造は、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      ! Symbolic Link
CD = D:\test\link

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

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

この結果、シンボリックリンクはディレクトリへのリンクを通してプログラムを実行できますが、ショートカットはディレクトリへのリンクを通してプログラムを実行できないことを確認できました。

この違いは非常に重要で、SSD上のCドライブからハードディスクにフォルダを移動させる際にショートカットではなく、シンボリックリンクを使う理由になります。

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

シンボリックリンクとジャンクションはどちらもソフトリンクですが、特にネットワークやパスの扱いに注意が必要です。具体的には次の違いがあります。

項目シンボリックリンクジャンクション
適用対象ファイルとディレクトリ両方ディレクトリのみ
パス形式絶対・相対パスの両方が可能強制的に絶対パスに変換
ネットワークネットワーク越しにリンク可能ローカルディスクのみ
アクセス権限サーバー側で判断(リンク先のアクセス権がなければアクセスできない)クライアント側で判断(リンク先のアクセス権がなくてもアクセスできる)

アクセス権限については、権限そのものが変わるのではなく、「リンク先がどこにあるかを探す作業」をサーバー側が行うため、クライアントからはあたかもアクセス権があるようにリンク先にアクセスすることができます。

[検証]パス形式の違い

シンボリックリンクは、絶対パスと相対パスのどちらでも作成できますが、ジャンクションは、強制的に絶対パスに変換されます。例えば、ディレクトリ「D:\test\」に、ディレクトリ「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

となり、ジャンクションでは[]内のパスが絶対パスとなっているのに対し、シンボリックリンクでは[]内のパスが相対パスになっていることを確認できます。

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

シンボリックリンクはクライアント側でアクセス権が判断されますが、ジャンクションはサーバー側でアクセス権が判断されます。

例えば、パソコン1とパソコン2があり、パソコン2に次の2つのディレクトリがあるとします。

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

このとき、パソコン1は、パソコン2の共有フォルダであるフォルダAにのみアクセスできます。

このフォルダAにフォルダBへのシンボリックリンクがある場合、パソコン1はシンボリックリンクを通して、パソコン2の非共有フォルダBにアクセスすることはできません。

一方で、フォルダAにフォルダBへのジャンクションがある場合、パソコン1はジャンクションを通して、パソコン2の非共有フォルダBにアクセスすることができます。

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

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

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

パソコンを購入した場合にCドライブがSSD、Dドライブがハードディスクの場合がよくあります。SSDは処理速度が速く、一般的なデータ書き込み量(一日20GBから40GB)ではハードディスクよりも寿命が長いと言われております。

この処理速度の速さのため、パソコンの起動に関するデータはSSDであるCドライブに保存されております。

しかし、SSDはデータの書き込み量が多いほど寿命は短くなり、一度壊れるとデータを復元することが困難であるというデメリットもあります。このため、SSDにデータ類が保存されないように、シンボリックリンクを使用してHDDにリンクを張ることが行われます。

例えば、ドキュメントやデスクトップ、ダウンロードのフォルダをハードディスクに移動することが考えられます。これらのフォルダにはアプリやブラウザにより自動的にデータが保存されることがよくあります。

ここでは、ダウンロードフォルダを例にします。ダウンロードフォルダは、デフォルトでは、

C:\Users\user_name\Downloads

にあります(user_nameはご自身のユーザー名になります)。まず、このフォルダを、

D:\Users\user_name\

の中に移動します。移動は、エクスプローラー上でダウンロードフォルダを切り取り、D:\Users\user_name\の中に貼り付けます

次に、以下のコマンドを実施します。

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

エクスプローラーではダウンロードフォルダは日本語で「ダウンロード」と書かれていますが、cmd上では「Downloads」であることにご注意ください。この英語名は、フォルダを右クリックして現れるメニューのプロパティから確認できます。ブラウザから適当なファイルをダウンロードフォルダに保存して、D:\ドライブ上に保存されれば成功です。これにより、Cドライブのダウンロードフォルダをシンボリックリンクで置き換えることができました。

Windows11では、右クリックで表示できるプロパティから「場所」タブを選択し、「移動」ボタンから移動できます。この場合、ユーザーが手動でmklinkコマンドを叩く必要はなくなりました。

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

ソフトウェアをインストールするときに、システム環境変数のPATHが長すぎて「この環境変数は大きすぎます」というダイアログが出て、ソフトウェアをインストールできない場合があります。

多くの場合、ソフトウェアはC:\Program Files (x86)\C:\Program Files\にインストールされるため、これらのフォルダ名を短くすることでPATHを短くすることができます。

その方法の1つとして、シンボリックリンクを利用できます。

例えば、

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

としてシンボリックリンクを作成し、システム環境変数PATHの"C:\Program Files (x86)"の部分を"C:\P86"に、"C:\Program Files"の部分を"C:\P"に置き換えることで、PATHを短くすることができます。

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

プログラムの出力先のフォルダが固定されている場合に、その出力ファイルをネットワーク上に書き出したい場合があるかもしれません。

この場合、出力フォルダを同じ名前をもつシンボリックリンクに置き換えることで可能になります。

シンボリックリンク先はネットワークドライブになります。

コマンドプロンプト(cmd)はUNCパスを扱うことができないため、ネットワークドライブにシンボリックリンクを張るときはPowerShellを使用する方が便利です。

UNCパスとは「\\networkdrive_name\directory_name」という形でネットワークドライブへのパスを表す方法です。Powershellを管理者権限で開き、

New-Item -Type SymbolicLink -Path link_name -Value \\networkdrive_name\directory_name

を実行します。link_nameにはプログラムの出力ファイルの名前にします。networkdrive_nameにはIPアドレスまたはサーバー名を設定します。これで、出力結果がネットワークドライブ上のディレクトリ(directory_name)に出力されます。

コマンドプロンプトを用いる場合には、ネットワークドライブの割り当てを実行した後に、割り当てたドライブに対してシンボリックリンクを張ります。

ネットワークドライブの割り当てはエクスプローラーでPCを右クリックすることで現れるメニューから行うことができます。

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

例えば、Zドライブに割り当てた場合には、管理者権限で開いたコマンドプロンプト上で、次のコマンドを実行します。

mklink /D link_name Z:\directory_name

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

プログラムを作成している場合に、ソースコード作成やコンパイルを行うディレクトリと、プログラムを実行するディレクトリを分けると開発環境がすっきりする場合があります。

このとき、プログラムを実行するディレクトリに、コンパイルでできた実行体へのシンボリックリンクを張ると、

  • コンパイルしたら実行ディレクトリのフォルダにある実行体も更新される。
  • 実行ディレクトリにあるシンボリックリンクを実行したときに、出力ファイルは実行ディレクトリに出力されるため、開発環境が汚れない。

というメリットがあります。好みの問題もありますが、このような形で開発フォルダと作業フォルダを分けるのが便利です。

まとめ

以上、シンボリックリンクの作成方法とメリット、使用例についてご紹介しました。

シンボリックリンクは単なる「近道」ではなく、Windowsに「そこにあると思い込ませる」高度な機能です。特にネットワーク共有やストレージの整理、開発環境の構築において、その特性(ソフトリンク・ハードリンクの違い)を正しく使い分けることで、PCの運用効率は飛躍的に向上します。

-TECHNOLOGY
-