(O+P)ut

アウトプット



(O+P)ut

エンジニアのアウトプット

【UNIX】ディレクトリをtar.gzにして分割する

スポンサーリンク

目的 と その手順

やりたいこと

ディレクトTest_dirを別サーバに送付したい。
ただし、容量が巨大なため、分割して送りたい。

やりたいことを実現する手順
  1. ディレクトリTest_dirをファイルtest.tar.gzにまとめる
  2. ファイルtest.tar.gzを分割
  3. 別サーバに送付
  4. 別サーバで分割されたファイルを結合
  5. test.tar.gzを解凍しディレクトリTest_dirに戻す

順を追って記載します。
ちなみに、自環境はWIndowsに入れたCygwinで送付先はUNIXサーバです。

ディレクトリをファイルにまとめる

ディレクトTest_dirが存在しています。

まずは、duコマンドでファイルのサイズを見てみます。

$ du -s Test_dir
2341907 Test_dir

$ du -sh Test_dir
2.3G    Test_dir

sオプションをつけることでディレクトリ全体の集計(summarize)結果が出力でき、
hオプションをつけることで人間が読みやすい(human-readable)単位に変換してくれます。

ディレクトリ全体で約2.3GBですね。

これをtar.gzファイルにします。

tar cvfz test.tar.gz Test_dir

cオプションをつけることでアーカイブを新規に作成(create)を行い、fオプションをつけることでファイル名(file)を指定します。
vオプションをつけることで処理したファイルの一覧を標準出力に表示(verbose)します。このオプションは省略可能です。
zオプションをつけることで、アーカイブしつつgzip形式(zip)にて出力できます。

容量も小さくなっています。

$ du test.tar.gz
1809176 test.tar.gz

$ du -h test.tar.gz
1.8G    test.tar.gz

ちなみに、zオプションをつけずにtarにするとファイルサイズは2340540と微減していた程度でした。

ファイルを分割

今回は、ファイルtest.tar.gzを100MB単位に分割しました。

$ split -b 100m -a 2 test.tar.gz test_p_

この見方ですが、
-b 100mで100MB単位で分割することを指定しています。
-a 2 にてファイル名をaaから始まるアルファベットに指定しています。
他の分割方法に関しては割愛しますが、最後に指定した「test_p」の後ろに分割された分だけ名前をつけられてファイルが作成されます。

分割されているかを確認します。

$ ls -l | grep test_p_
-rw----r--+ 1 ..  104857600 .. test_p_aa
-rw----r--+ 1 ..  104857600 .. test_p_ab
-rw----r--+ 1 ..  104857600 .. test_p_ac
-rw----r--+ 1 ..  104857600 .. test_p_ad
-rw----r--+ 1 ..  104857600 .. test_p_ae
-rw----r--+ 1 ..  104857600 .. test_p_af
-rw----r--+ 1 ..  104857600 .. test_p_ag
-rw----r--+ 1 ..  104857600 .. test_p_ah
-rw----r--+ 1 ..  104857600 .. test_p_ai
-rw----r--+ 1 ..  104857600 .. test_p_aj
-rw----r--+ 1 ..  104857600 .. test_p_ak
-rw----r--+ 1 ..  104857600 .. test_p_al
-rw----r--+ 1 ..  104857600 .. test_p_am
-rw----r--+ 1 ..  104857600 .. test_p_an
-rw----r--+ 1 ..  104857600 .. test_p_ao
-rw----r--+ 1 ..  104857600 .. test_p_ap
-rw----r--+ 1 ..  104857600 .. test_p_aq
-rw----r--+ 1 ..   70014907 .. test_p_ar

最後の切れ端だけ100MB以下になりますが、想定通り分割されています。

$ du -h test_p_aa
100M    test_p_aa

別サーバに送付

Cygwinであればscpコマンド等を使えば送付できます。

分割されたファイルの結合

splitコマンドで分割したファイルの結合に関しては、おなじみのcatコマンドで行えます。

$ cat test_p_* > test2.tar.gz

今回は、わかりやすいようにファイル名test2.tar.gzにしています。

$ du test2.tar.gz
1809176 test2.tar.gz

ファイルサイズも一致しています。

解凍して元のディレクトリに戻す

圧縮した時のcxに変更すれば解凍(extract)できます。

tar -zxvf test2.tar.gz

解凍により、元のディレクトリ名に戻ります。正式にいえば、そのディレクトリのルートのディレクトリ名です。*1

ファイルサイズを確認し、変化がないことがわかります。

$ du -s Test_dir
2341947 Test_dir


以上、圧縮して分解して結合して解凍する流れの備忘録でした。

*1:解凍する環境でtarがzに対応していない場合はgunzip -d でまずはgzを外します