Linux間で大量のファイルを同期・移動させる

よくやるのでメモ。

お手軽な方法

scp -r source/dir dest-server:dest/dir

上記コマンドを実行するためには、事前に

ssh dest-server

でログインできることが前提。

ちゃんと同期させたい場合

rsyncを使う。

rsync -avz source/dir dest-server:dest/dir

これもsshでログインできるような状態になっていることが前提。

大量のファイルがある場合

ファイルが大量にある場合だとrsyncでは遅い。また、rootでしか読めない権限のファイルを送る場合もちょっと面倒なことになる。

こういう場合はもうtarアーカイブにするのが経験上、最も早い。ただ、tarを作ってそれをscpで送って…とするとネットワークで転送する時間が勿体ないし、大容量のファイルの場合はディスク容量が足らなくなる場合もあるだろう。なので、netcatで作ったそばから送って解凍するのが一番良い。さらに、圧縮も早くて圧縮率の高いzstdを並列で使う(pzstd)とさらに良いと思う。多分。

要するに、こうすればよい。ファイルを受け取る側で以下を実行:

nc -l 8000 | pzstd -d | tar xvf -

ファイルを送る側で以下を実行:

tar cvf - dir1 dir2 dir3 | pzstd | nc dest-server 8000

こうすると、一番早く、ディスク容量を必要とせず転送できると思う。

もし、途中で失敗してしまったり、ちゃんと同期できたか不安な場合はもう一度rsyncをかければよい。

なお、経験上zstdの圧縮レベルはデフォルトが一番良い。高くしても時間がかかる割にそこまで圧縮率が変わらない。なんか経験上の話ばっかりですが以上です。