大量のデータを別ホストへコピーしたい時にNW帯域が細い場合、データを圧縮してから別ホストへコピーをすると思いますが、圧縮・コピー・相手先での解凍を行いますが、ひとつずつコマンドを叩いているととても非効率です。
今回は、自ホストでの圧縮・相手先サーバへの転送・相手先ホストでの解凍を1コマンドで実行するストリームコピー方法を紹介します。
テスト用ディレクトリとファイル構成
ディレクトリ構成は以下のようにしました。”1G_file”はddで作ったファイルです。
[dekiru@cent76 ~]$ tree data/
data/
`-- files
`-- 1G_file
1 directory, 1 file
1Gの転送用ファイルはddコマンドでテキトーに作りました。
[dekiru@cent76 ~]$ dd if=/dev/zero of=1G_file bs=1024k count=1000
1000+0 records in
1000+0 records out
圧縮・解凍しながらの転送コマンド
tarコマンドで固めて圧縮しながら、以下のように別ホストへ転送・解凍します。
tar cvf – 転送したいディレクトリ | 圧縮コマンド | ssh 相手先OSユーザ@相手先ホスト ‘tar zxvf – -C 相手先ディレクトリ ‘
ディレクトリを転送してみる
gzipコマンドを使用して圧縮・転送・解凍を1ライナーで実行してみます。
[dekiru@cent76 ~]$ tar cvf - ./data/ | gzip | ssh dekiru@aitesrv 'tar zxvf - -C /tmp/ '
./data/
./data/files/
./data/files/1G_file
dekiru@aitesrv's password:
./data/
./data/files/
./data/files/1G_file
相手先のディレクトリ構成は以下のようになります。
[dekiru@aitesrv ~]$ ls -l /tmp/data/files/1G_file
-rw-rw-r--. 1 dekiru dekiru 1048576000 Jan 10 19:12 /tmp/data/files/1G_file
ファイルを転送してみる
以下のコマンドでファイルを転送すると、ディレクトリ構造までコピーされてしまいます。
[dekiru@cent76 ~]$ tar cvf - ./data/files/1G_file | gzip | ssh dekiru@aitesrv 'tar zxvf - -C /tmp/ '
./data/files/1G_file
dekiru@aitesrv's password:
./data/files/1G_file
[dekiru@aitesrv ~]$ ls -l /tmp/data/files/1G_file
-rw-rw-r--. 1 dekiru dekiru 1048576000 Jan 10 19:12 /tmp/data/files/1G_file
1つのファイルをコピーしたい場合は、cdして転送します。
[dekiru@cent76 ~]$ cd data/files/
[dekiru@cent76 files]$ tar cvf - 1G_file | gzip | ssh dekiru@aitesrv 'tar zxvf - -C /tmp/ '
1G_file
dekiru@aitesrv's password:
1G_file
[dekiru@aitesrv ~]$ ls -l /tmp/1G_file
-rw-rw-r--. 1 dekiru dekiru 1048576000 Jan 10 19:12 /tmp/1G_file