rsyncでファイルサーバとローカルディスクを同期する
背景
最近、Windowsマシンからファイルサーバ上にある数GBのファイル群を扱うことが多い。このとき、ファイルサイズが大きいのでファイルを開くたびに結構な時間を待たされていて困っている。
DropboxやGoogle driveのデスクトップクライアントのように、アクセス頻度が高いデータはローカルディスクに保存してあって直ぐに開けるようになっていてほしい。
解決方法
クライアントがWindowsなので今までその気にすらならなかったが、単にLinuxと同様にrsyncを使えば良いことに気づく。ただし、ファイルサーバがSMBしか使えないので、Linuxのようにssh経由でコピーすることはできない。
また、アクセス頻度が高いデータだけをコピーしてくる...というのは難しそうなので、今回はディレクトリ全体をファイルサーバ - クライアントマシン間で同期することにする。
1. Windowsにrsyncを入れる
メインの作業はLinuxのbashで行っているので、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 や タスクスケジューラ を使おうと思う。