TECHNOLOGY

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

パソコンの画像

本記事では、Windowsにおけるシンボリックリンクの概要、作成方法、シンボリックリンクの応用例をご紹介します。

目次

  1. シンボリックリンクとは?
  2. シンボリックリンクの作成方法
    1. コマンドプロンプト
    2. PowerShell
  3. シンボリックリンクの削除方法
  4. シンボリックリンクとショートカットの違い
    1. 作業ディレクトリの違い
    2. ディレクトリへのリンク越しのファイルの実行の可否
  5. シンボリックリンクとジャンクションの違い
    1. 適用対象(ファイルとディレクトリ)
    2. 相対パスの使用の可否
    3. ネットワーク越しのリンクの可否
    4. 接続先PCでリンクが使用されている場合のアクセス権限
  6. シンボリックリンクの使用例
    1. SSDにデータ類が保存されないようにHDDにリンクを張る
    2. 環境変数の文字列制限を回避する
    3. 出力ファイルをネットワークドライブ上に出力する
    4. 開発フォルダと作業フォルダを分けて扱う
  7. まとめ

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

シンボリックリンクは、ファイルやフォルダーへのショートカットのように、ある場所にあるファイルやフォルダーを別の場所から参照することができます。

Windowsには、ハードリンクとソフトリンクがあります。その違いを以下にまとめました。シンボリックリンクはソフトリンクの一種です。

内容リンク先との関係
ハードリンク■同じデータに別の名前をつけてアクセスします。
■ハードリンクを作成すると、リンク数が増加します。
リンク数が0にならない限り、ハードリンクを削除してもデータは削除されません。
■別の名前をつけているだけなので、ハードリンクを作成してもメモリは消費されません。
■元ファイルを削除しても、作成したハードリンクの機能は失われません。
■ファイルにのみ使用できます。ディレクトリには使用できません。
■作成したハードリンクとリンク先のファイルは同じパーティション(Cドライブ等)にある必要があります。
ソフトリンク■別のファイルを作成し、そのファイルを通してリンク先のデータにアクセスします。
■シンボリックリンクとジャンクションの2種類があります。
■リンクを作成してもメモリは消費されません。
■元ファイルを削除すると、ファイルにアクセスできなくなります。
■リンクを削除しても、元ファイルは削除されません。
■シンボリックリンクはファイルとディレクトリのどちらにも使用できます。
■ジャンクションはディレクトリのみ使用できます。

ショートカットを作成すると、そのショートカットを通してディレクトリを開いたり、プログラムを実行できますが、元のプログラムやフォルダを削除するとアクセスできなくなります。

ソフトリンクはその点でショートカットと同じです。

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

前提として、Windows上でシンボリックリンクを作成できるのは、NTFSフォーマットのドライブ上になります。

ここでは、コマンドプロンプトで作成する方法とPowerShellで作成する方法を説明します。

コマンドプロンプト

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

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

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

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

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

mklink [option] link_name target_name

となります。link_name には作成するリンクの名前を、target_nameにはリンクが参照する既存のファイルまたはディレクトリのパスを設定します。オプションには、

オプション意味
なしファイルに対するシンボリックリンクを作成します。
/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 link_name -Value target_name

target_nameが既存のファイルの名前、link_nameが作成するリンクの名前になります。

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

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

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

エクスプローラーから通常のファイルと同じ方法で削除できます。

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

del file_name

を使用し、ディレクトリへのリンクを削除する場合には、

rmdir directory_name

を使用します。

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

シンボリックリンクとショートカットの大きな違いは、

  1. 作業ディレクトリ
  2. ディレクトリへのリンク越しのファイルの実行の可否

になります。結論を先に述べると次の違いがあります。

シンボリックリンクショートカット
作業ディレクトリコマンドを実行したディレクトリリンク先のファイルがあるディレクトリ
ディレクトリへのリンク越しのファイルの実行可能不可

作業ディレクトリの違い

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

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

@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ドライブからハードディスクにフォルダを移動させる際にショートカットではなく、シンボリックリンクを使う理由になります。

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

シンボリックリンクとジャンクションはどちらもソフトリンクです。これらのリンクの大きな違いは、

  1. 適用対象(ファイルとディレクトリ)
  2. 相対パスの使用の可否
  3. ネットワーク越しのリンクの可否
  4. 接続先PCでリンクが使用されている場合のアクセス権限

になります。結論を先に述べると次の違いがあります。

シンボリックリンクジャンクション
適用対象(ファイルとディレクトリ)ファイルとディレクトリのどちらにも適用可能ディレクトリに対してのみ適用可能
相対パスの使用の可否絶対パスと相対パスのどちらも使用可能強制的に絶対パスに変換される
ネットワーク越しのリンクの可否ネットワーク越しにリンク可能ローカルディスクにのみリンク可能
接続先PCでリンクが使用されている場合のアクセス権限リンク先のアクセス権がなければアクセスできないリンク先のアクセス権がなくてもアクセスできる

適用対象(ファイルとディレクトリ)

シンボリックリンクは、ファイルとディレクトリのどちらに対しても作成することができます。一方、ジャンクションは、ディレクトリに対してのみしか作成することができません。

相対パスの使用の可否

シンボリックリンクは、絶対パスと相対パスのどちらでも作成できますが、ジャンクションは、強制的に絶対パスに変換されます。例えば、ディレクトリ「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にデータ類が保存されないようにHDDにリンクを張る

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

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

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

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

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

C:\Users\user_name\Downloads

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

D:\Users\user_name\

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

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

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

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

環境変数の文字列制限を回避する

ソフトウェアをインストールするときに、システム環境変数の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

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

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

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

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

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

mklink /D link_name Z:\directory_name

開発フォルダと作業フォルダを分けて扱う

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

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

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

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

まとめ

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

シンボリックリンクの作成は、色々と応用が利くため、ぜひ日々の業務でご活用いただけましたら幸いです。

-TECHNOLOGY
-