rsyncでファイルサーバとローカルディスクを同期する

背景

最近、Windowsマシンからファイルサーバ上にある数GBのファイル群を扱うことが多い。このとき、ファイルサイズが大きいのでファイルを開くたびに結構な時間を待たされていて困っている。

DropboxGoogle driveのデスクトップクライアントのように、アクセス頻度が高いデータはローカルディスクに保存してあって直ぐに開けるようになっていてほしい。

解決方法

クライアントがWindowsなので今までその気にすらならなかったが、単にLinuxと同様にrsyncを使えば良いことに気づく。ただし、ファイルサーバがSMBしか使えないので、Linuxのようにssh経由でコピーすることはできない。

また、アクセス頻度が高いデータだけをコピーしてくる...というのは難しそうなので、今回はディレクトリ全体をファイルサーバ - クライアントマシン間で同期することにする。

1. Windowsrsyncを入れる

メインの作業はLinuxbashで行っているので、Windowsマシンを使うときは Git for Windows を入れたときについてくる Git bash (msys2の機能削減版) を使っている。したがって、Git bashからrsyncを使えるようにセットアップを進める。

通常版のmsys2であれば最初から入っているか pacman -S rsync でインストール可能なのだが、Git bashは機能削減版なので簡単に入れられず。。。

(こちら)https://qiita.com/clvth14/items/5a7eb26ddca49b7f57c2 の記事を参考に、rsync と必要なdllをインストール

2. ファイルサーバのマウント

共有フォルダ もしくは ネットワークドライブ としてファイルサーバをマウントする。共有フォルダにGit bashから cd で移動したい時は、//<server_ip or host>/share のように行頭の / が2つ必要なことに注意。ネットワークドライブであれば割り当てられたドライブレター (/z/ など) で通常通りアクセス可能

3. rsyncで同期

rsyncとファイルサーバのセットアップが終われば、後は rsync コマンドを実行してファイルコピーを行えばよい。

例えば、rsync -arP <file_sever> <local_disk> みたいな感じで実行すると、コピー状況を表示しつつディレクトリを再帰的にコピーしてくれる。再帰的にコピーする際、特定のファイルやファイル形式だけコピーしたくないといった事情があるなら、 excludeオプションで除外すればよい。--exclude '*.jpg' のような感じ。

今のところは同期したい時だけスクリプトを叩くようにしているが、定期的に同期を走らせたくなったら cron や タスクスケジューラ を使おうと思う。