orangeitems’s diary

40代ITエンジニアが毎日何か書くブログ

Windowsのシンボリックリンク機能知られなさすぎ

f:id:orangeitems:20191020122309j:plain

 

問題

Windowsのバッチファイルを持っていて、その処理対象ファイルが相対パス指定だったとします。例えば、

 

c:\batch\test.bat .\ADIR\*.*

 

と言うふうに、c:\temp直下に、ADIRというディレクトリがある前提でバッチファイルが書いてあるとします。

で、ADIRの直下にファイル群を持ってくればtest.batが処理してくれるよ~、というこのバッチファイルですが、以下の問題を持ちます。

 

Dドライブのとあるパス、例えば、d:\souko\20191020\にたくさんファイルがあるとします。

でもバッチファイルはC:\batch直下にある。

だから、test.batを実行する前に、C:\batch\ADIR直下にコピーしなければいけない。

 

CドライブとDドライブは物理的に違うので、ファイル数が多いとコピーしたときにやたら時間がかかります。

また、d:\souko\20191020が終わった後、d:\souko\20191019をさらに取り扱いたいとき、コピーしたものを消して、またコピーするというのはさらに時間がかかる。

ファイルを書いたり消したりっていうのは、SSDにとっても良くない。

d:\souko\yyyymmddディレクトリを、c:\batch\ADIRにマウントできないのか・・。

 

というときに使える機能が「シンボリックリンク」です。

この機能、Linuxだとシンボリックリンクだけど、Windowsは使えないな困ったなと思っていたら存在することに気が付きました。

便利な割にあまり知られていないのでメモしておきます。

 

解決方法

これだけです。

 

1) コマンドプロンプトを「管理者として実行」します。

2) 以下のコマンドを実行してください。

mklink /D c:\temp\ADIR d:\souko\20191020 

 

ほんとにこれだけ。以下、実行例です。

なお、mklinkの/Dオプションを忘れないでくださいね。ディレクトリのシンボリックリンクですよーという意味です。

 

f:id:orangeitems:20191020120637p:plain

 

シンボリックリンクを作るのは一瞬です。ファイルの実体はコピーしません。

ですが、そのままcd c:\temp\ADIRすると、d:\souko\20191020の実体が見えます。

 

f:id:orangeitems:20191020120805p:plain

 

こうすれば、ファイルをコピーする必要が全くないのです。すごい。

 

なお、d:\souko\20191020のファイル処理が終わったので、次にd:\souko\20191019にシンボリックリンクを張り替えたいときはこのようにします。

 

1) コマンドプロンプトを「管理者として実行」します。

2) 以下のコマンドを実行してください。

rmdir c:\temp\ADIR

mklink /D c:\temp\ADIR d:\souko\20191019

 

ディレクトリのシンボリックリンクを消すときは、rmdirコマンドを使うというのがポイントです。

 

f:id:orangeitems:20191020121534p:plain

 

見事にADIRの中身が貼り替わりました。

1秒かからずに、ADIRの中身を変えられるのが素敵です。

今まで実体をコピーしてたのがアホらしいです・・。

 

mklinkコマンドの詳細

もっとちゃんと知りたい方向けに、参考記事をリンクしておきます。

 

www.atmarkit.co.jp

 

「WindowsにもLinuxでできる・・・みたいな機能あればいいのにな」というのはだいたいは実装されていると思っていいんじゃないかと最近思うようになってきました。

「Windows Subsystem for Linux(WSL)2」が正式実装されたらもっとLinuxっぽいことができそうだなと期待しています。

 

シンボリックリンク機能、あまりにも便利なので共有しておきます。