scp
に -r
をつけると、ディレクトリ内のファイルを再帰的にコピーします。しかしファイル数が多い時は scp -r
よりもディレクトリを一つのアーカイブに固めたほうが、効率よくファイルを転送できます。ということでベンチマークをとってみました。対象は自分の環境の /usr/include
で、ファイル数は2226個でした。
追記: scp -Cr
, sftp
, sftp -C
の結果を追加しました。
比較対象
-
scp -r
: ディレクトリを再帰的にscp
scp -r /usr/include example.com:
-
tar c
: ディレクトリをtarに固めて転送
tar cf - /usr/include | ssh example.com 'tar xf -'
-
tar cz
: ディレクトリをtar.gzに固めて転送
tar zcf - /usr/include | ssh example.com 'tar zxf -'
-
scp -Cr
: SSHの圧縮を有効にしてscp -r
scp -Cr /usr/include example.com:
-
sftp
: SFTPでディレクトリ転送
sftp -b <(echo put -r /usr/include) example.com
-
sftp -C
: SSHの圧縮を有効にしてSFTPでディレクトリ転送
sftp -C -b <(echo put -r /usr/include) example.com
結果
転送時間 | |
---|---|
scp -r |
2m29.534s |
scp -Cr |
2m18.356s |
sftp |
2m24.265s |
sftp -C |
2m28.265s |
tar c |
2.276s |
tar zc |
1.032s |
ダントツに、scp -r
よりもアーカイブ化したほうが転送速度が短くなりました。/usr/include
以下は圧縮率が良いのか、tar.gzにしたほうが更に転送時間が短くなりました。
結論
ディレクトリをSSH経由で転送するときは
tar zcf - <from_dir> | ssh <target_host> 'tar zxf -'