PR

Linux ディレクトリやファイルを別ホストへ圧縮・解凍しながらコピーする方法

スポンサーリンク
Linux

大量のデータを別ホストへコピーしたい時に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