ファイル分割について

たまに tar で固めたファイル、または zipgz で圧縮したファイルを分割して転送したいときがあります。

そのときに役に立つのがファイルを分割する split コマンドですが、tar で固めてから また split コマンドを使うのは面倒なので、tar で固めると同時にファイルを分割する方法を紹介します。

やってることは、単純ですが、大きな流れとしては、

  • dd コマンドを使って 10MB のダミーファイルを作成
  • tarsplit を使ってファイルを分割しながら固める
  • ダミーファイルを削除
  • 分割した tar ファイル復元し、解凍

Data Flow ロジック・フロー図

tar-slice

Step 1. dd コマンドを使って 10MB のダミーファイルを作成

まずはテスト用として、dd コマンドを使って 10MB のダミーファイルを作成します。

ダミーファイル作成Raw Code(S)Raw Code(T)
$ dd if=/dev/zero of=./dummy.dat bs=10M count=1
1+0 records in
1+0 records out
10485760 bytes (10 MB) copied, 0.0116451 s, 900 MB/s

$ ls -lh dummy.dat
-rw-r--r-- 1 root root 10M 11月 24 15:14 2014 dummy.dat

Step 2. tar と split を使ってファイルを分割しながら固める

split コマンドを使ってファイルを分割した場合、元のファイルは削除されずに、そのまま残ります。

また、分割されたファイルは、お尻にアルファベットが付与されます。

-a オプションを指定することでアルファベットの長さを指定することも可能ですが、普通は、そこまで使わないので、省略します。(デフォルトで 2桁)

分割しながら tar で固めるRaw Code(S)Raw Code(T)
$ tar cvf - dummy.dat | split -b 1m - piece.tar_
./dummy.dat

$ ls -lh
合計 21M
-rw-r--r--  1 root root  10M 11月 24 15:14 2014 dummy.dat
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_aa
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ab
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ac
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ad
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ae
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_af
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ag
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ah
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_ai
-rw-r--r--  1 root root 1.0M 11月 24 15:15 2014 piece.tar_aj
-rw-r--r--  1 root root  10K 11月 24 15:15 2014 piece.tar_ak

split を単独で使う時には、以下のようにします。

$ split -b 1024 data.tar.gz

$ split -b 1k data.tar.gz

$ split -b 1m data.tar.gz

Step 3. ダミーファイルを削除

後で解凍できることを確認するために、最初に作成したダミーファイルを削除します。

ダミーファイル削除Raw Code(S)Raw Code(T)
$ rm dummy.dat
rm: remove 通常ファイル `dummy.dat'? y

Step 4. 分割した tar ファイル復元し、解凍

複数にスライスされた .tar_○○ を一つのファイルに復元するには、単純に cat でファイルリストを指定し、リダイレクトするだけで良いです。

一つのファイルに復元できることを確認した後、解凍し、元のダミーファイルを取り出しましょう。

$ cat piece.tar_* > piece.tar

$ ls -lh piece.tar
-rw-r--r-- 1 root root 11M 11月 24 15:17 2014 piece.tar

$ tar xvf piece.tar
./dummy.dat

$ ls -lh dummy.dat
-rw-r--r-- 1 root root 10M 11月 24 15:14 2014 dummy.dat

cat すると同時に解凍したい時には、以下のように。

$ cat piece.tar_* | tar -xvf -

以上、ファイルを分割しながら tar で固めるでした。