Windowsユーザーならショートカットは使ったことがあると思います。ショートカットの本体は、目的のパスが記載された単なるファイル(拡張子 .lnk)であるので、エクスプローラで素早く目的のファイル・フォルダを開くためには役に立ちますが、ほかのプログラムやコマンドからアクセスしようとすると思ったようには動作してくれません。例えば次のようなケースではショートカットではうまくいきません。
OneDriveでデータを同期していて、自宅のデスクトップPCではOneDriveはDドライブ直下だが、持ち運び用のモバイルPCではCドライブ直下にOneDriveフォルダを置いているとします。この時、あるアプリケーションでOneDrive上のフォルダを開くためにはPCごとにデータの保存先を正しく指定しなくてはいけません。
例えばPythonで何か処理するプログラムを組んでいて、ソースコードをGitHubなどでPC間で同期していても、ファイルの保存先は扱っているPCごとに毎回書き換えなくてはいけなくなってしまいます。こういう場合に、ショートカットを用いても、Pythonプログラムからは、そこに.lnkファイルがあると認識されるだけですよね?
こういう場合には、「シンボリックリンク」というものを活用すると解決できます。
[toc]シンボリックリンクとは?
シンボリックリンクはショートカットに似た仕組みですが、ショートカットとは違い、プログラムやコマンド上からもそこにターゲットのファイル・フォルダが存在していると見せかけることができます。
ファイルに対するシンボリックリンク
以下の例では「D:\BioTech-Lab」フォルダに「D:\BioTech-Lab\folder\TargetText.txt」に対するショートカットとシンボリックリンクを作成しています。

それぞれのプロパティは以下のようになります。

また、シンボリックリンクに対しては、以下のようにプログラム上からもあたかもそこにファイルがあるかのように扱うことができますが、ショートカットではできません。
f = open('D:\\BioTech-Lab\\TargetText - シンボリックリンク')
print(f.read())
f.close()
フォルダに対するシンボリックリンク
以下の例では「D:\BioTech-Lab」フォルダに「D:\BioTech-Lab\folder\TargetFolder」フォルダに対するショートカットとシンボリックリンクを作成しています。

シンボリックリンクとショートカットはともに同じアイコンですが、シンボリックリンクの方は「種類」がファイルフォルダーとして扱われています。
それぞれのプロパティも見ていきましょう。

こちらでも、フォルダに対するショートカットも単なる.lnkファイルとして扱われていますが、シンボリックリンクではリンク自体がフォルダとして扱われているのが分かります。
さらに、ショートカットを開くと次のようにショートカットで指定されたパスのフォルダが開きます。

しかし、シンボリックリンクを開くと、次のようにそれ自体がフォルダであるかのようにエクスプローラ上でもパスが表示されます。

同様に、アプリケーションやコマンドなどからもシンボリックリンク自体がフォルダであるかのように扱うことができます。
シンボリックリンクの作成方法
シンボリックリンクは非常に有用ですが、なぜかショートカットのようにGUIを用いて作成することができません。以下のようにコマンドプロンプトを用いて指定する必要があります。
ファイルへのシンボリックリンクを作成する場合
mklink リンク名 ターゲット名
- リンク名:作成するシンボリックリンクの名前を指定します。
- ターゲット名:リンクして開きたいファイルを指定します。
リンク名・ターゲット名ともに、絶対パス、もしくはカレントディレクトリからの相対パスで指定します。ただし、ターゲット名を絶対パスで指定した場合は、その上位フォルダの名前を変更しただけでターゲットの絶対パスが変わってしまいリンクが切れてしまいますので、相対パスでの指定がよいと思います。
例えば上記の例の場合は、コマンドプロンプトで次のようになります。

フォルダへのシンボリックリンクを作成する場合
mklink /d リンク名 ターゲット名
ターゲットがフォルダの場合は上記のように/dというオプションを追加する必要があります。
例えば、上記の例で「D:\BioTech-Lab\folder\TargetFolder」にリンクを作成する場合は以下のようになります。

まとめ
以上のようにシンボリックリンクはショートカットと似ているようで全く別物であり、非常に有用です。私自身は複数のPCでOneDriveやGitHubのデータを同期していますが、それぞれのPCごとにローカル内でのフォルダが違うので、シンボリックリンクを用いてすべてCドライブ直下にあるように扱っています。これによってすべての環境で同じコマンドやプログラムを実行することができ非常に便利です。
ぜひ皆さんも、シンボリックリンクをうまく活用してみてくださいね!
コメント