【split】Linuxでファイルの分割と結合方法

Linuxで「split」コマンドを使用して、ファイルを指定したサイズや、指定した個数で分割する方法です。

大きいサイズのファイルを容量の小さなメディアで移動させいた場合や、メールで送信する際等にデータサイズの制限がある場合などに重宝します。

また、ファイルを分割する以外にも、コマンドの実行結果を分割することもできるので、そちらの方法についても説明していきます。

ファイル分割

ファイルを分割する場合は、どのような基準で分割するかをオプションで指定し、分割元のファイルと分割後のファイル名を指定します。

分割後のファイルは「指定したファイル名+サフィックス(接尾辞)」といった名前で作成されます。

また、分割後のファイル名を指定しなかった場合は、「x+a」から始まるファイル名で分割されます。

書式

split オプション 分割元ファイル 分割後ファイル名

オプション

オプション 説明
-a 桁数
–suffix-length=桁数
サフィックスの桁数を指定(初期値は2桁)
–additional-suffix=SUFFIX サフィックスの後に指定した文字列を設定
-b サイズ
–bytes=サイズ
分割するファイルサイズをバイト単位で指定 k(キロバイト)m(メガ)G(ギガ)
-C サイズ
–line-bytes=サイズ
行の最大サイズを指定
-d
–numeric-suffixes[=開始数字]
サフィックスを数字に変更
–numeric-suffixesを使うと開始番号を設定できる
-e
–elide-empty-files
-n オプションを指定した際に空のファイルを作成しない
–filter=コマンド 分割後のデータをコマンドにわたす場合に使用
-l 行数
–lines=行数
行単位で分割
-n 分割数
–number=分割数
指定した数に分割
-u
–unbuffered
バッファリングせずに入力を出力にコピーする
–verbose 分割時の詳細情報を表示

使用例

「split」コマンドの使用例です。

分割後のファイルサイズを指定してのファイルを分割例として、サイズが2GBのファイルを「-b」オプションを使用して500MBのファイルに分割しています。

$ ls -l 2G_data
-rw-rw-r-- 1 tamohiko tamohiko 2147483648 May 13 15:42 2G_data

分割後のファイル名を「2G_data.」とすることで、「2G_data.サフィックス」といったファイル名で分割後のファイルを作成させています。

$ split -b 500M  2G_data 2G_data.

分割後のファイルは以下のようになります。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.aa
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ab
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ac
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ad
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:43 2G_data.ae

分割後のファイル名を指定しなかった場合

分割後のファイル名を指定せずにファイルを分割してみます。

$ split -b 500M 2G_data

分割後のファイルは「xaa」「xab」「xac」…といった名前で作成されます。

$ ls -l
total 4194324
-rw-rw-r-- 1 tamohiko tamohiko 2147483648 May 13 15:42 2G_data
-rw-rw-r-- 1 tamohiko tamohiko  524288000 May 18 17:56 xaa
-rw-rw-r-- 1 tamohiko tamohiko  524288000 May 18 17:56 xab
-rw-rw-r-- 1 tamohiko tamohiko  524288000 May 18 17:56 xac
-rw-rw-r-- 1 tamohiko tamohiko  524288000 May 18 17:56 xad
-rw-rw-r-- 1 tamohiko tamohiko   50331648 May 18 17:56 xae

これだと何のファイルを分割したのかが分かりづらいので、分割後のファイル名は指定したほうが良いでしょう。

オプションについて

オプションの使用方法について説明していきます。

-a サフィックスの数を設定

「-a 桁数」オプションを使用することで、通常は2桁であるサフィックスの桁数を変更することが出来ます。

オプションを「-a 1」と設定して、桁数を1桁にしてみます。

$ split -b 500M -a 1 2G_data 2G_data.

分割後のファイルを確認すると、サフィックスが1桁になっていることが確認できました。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:45 2G_data.a
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:45 2G_data.b
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:45 2G_data.c
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:45 2G_data.d
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:45 2G_data.e

今度は3桁に設定してみます。

$ split -b 500M  -a 3 2G_data 2G_data.

サフィックスが3桁になっていることが確認できました。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:46 2G_data.aaa
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:46 2G_data.aab
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:46 2G_data.aac
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:46 2G_data.aad
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:46 2G_data.aae

–additional-suffix サフィックスを指定

このオプションを使用すると、サフィックスの最後につける文字列を指定することが出来きるため、サフィックスをそろえたい場合等にとても重宝します。

「.split 」という文字列を指定してみます。

$ split -b 500m --additional-suffix=.split  2G_data 2G_data_

分割後のファイルを確認してい見ると、すべて最後が「.split」になっていることが確認できました。

$ ls -l 2G_data_*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 16:11 2G_data_aa.split
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 16:11 2G_data_ab.split
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 16:11 2G_data_ac.split
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 16:11 2G_data_ad.split
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 16:11 2G_data_ae.split

-b サイズで分割

ファイルサイズを指定してファイルを分割します。

サイズの指定方法は K(キロ)M(メガ)G(ギガ)といった単位で指定する方法と、KB、MB、GBといった単位で指定する方法があります。

K、M、Gで指定した場合はサイズは1024倍で計算されます。

  • 1K 1024byte
  • 1M 1024*1024=1,048,576byte
  • 1G 1024*1024*1024=1,073,741,824byte

KB MB GBで指定した場合は1000倍で数値が計算されます。

  • 1KB 1000byte
  • 1MB 1,000*1,000=1,000,000byte
  • 1GB 1,000*1,000*1,000=1,000,000,000byte

※単位を指定しない場合はbyte(バイト)で指定したことになります。

-b 500Mでサイズを指定

サイズを指定する際の単位として「M」を使って、500MBごとにファイルを分割してみます。

分割後のデータは1024倍で計算されるため「500*1,024*1,024=524,288,000 byte」となります。

$ split -b 500M  2G_data 2G_data.

分割後のファイルを確認すると、データのサイズが「524,288,000 byte」であることが分かります。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.aa
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ab
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ac
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:43 2G_data.ad
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:43 2G_data.ae

-b 500MBでサイズを指定

サイズを指定する際の単位として「MB」を使って、500MBごとにファイルを分割してみます。

分割後のデータは1024倍で計算されるため「500*1,000*1,000=500,000,000 byte」となります。

$ split -b 500MB 2G_data 2G_data.

分割後のファイルを確認すると、データのサイズが「500,000,000 byte」であることが分かります。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 500000000 May 17 21:19 2G_data.aa
-rw-rw-r-- 1 tamohiko tamohiko 500000000 May 17 21:19 2G_data.ab
-rw-rw-r-- 1 tamohiko tamohiko 500000000 May 17 21:19 2G_data.ac
-rw-rw-r-- 1 tamohiko tamohiko 500000000 May 17 21:19 2G_data.ad
-rw-rw-r-- 1 tamohiko tamohiko 147483648 May 17 21:19 2G_data.ae

-C

1行ごとに指定したサイズ(byte)になるように分割していき、分割できなくなるまで処理を繰り返す。

下記のような2行の文章を1行あたり20byteで分割してみます。

$ ls -l test.txt
-rw-rw-r-- 1 tamohiko tamohiko 93 May 21 16:50 test.txt

$ cat test.txt
It is very nice weather today and it is very hot.
I hope the weather will clear up tomorrow.

1行を20バイトで分割してみます。

$ split -C 20 test.txt test.txt.

分割後のファイルを見てみると、1行目を「20byte」のファイル3つと「10byte」のファイルに分けて、2行目を「20byte」のファイル2つと「3byte」のファイルに分けていることが確認できます。

$ ls -l test.txt.*
-rw-rw-r-- 1 tamohiko tamohiko 20 May 21 16:52 test.txt.aa
-rw-rw-r-- 1 tamohiko tamohiko 20 May 21 16:52 test.txt.ab
-rw-rw-r-- 1 tamohiko tamohiko 10 May 21 16:52 test.txt.ac
-rw-rw-r-- 1 tamohiko tamohiko 20 May 21 16:52 test.txt.ad
-rw-rw-r-- 1 tamohiko tamohiko 20 May 21 16:52 test.txt.ae
-rw-rw-r-- 1 tamohiko tamohiko  3 May 21 16:52 test.txt.af

-d サフィックスを数字に変更

「-d」オプションを指定することで、サフィックスを数字に変更することが出来ます。

実際に「-d」オプションを指定して、ファイルを分割してみます。

$ split -b 500M -d 2G_data 2G_data.

サフィックスが数字に変更されたことが確認できました。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:50 2G_data.00
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:50 2G_data.01
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:50 2G_data.02
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:50 2G_data.03
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:50 2G_data.04

–numeric-suffixes サフィックスの開始番号を指定

サフィックスを任意の数字から始まるようにしたい場合は、「–numeric-suffixes=開始番号」オプションを使用します。

「10」から始まるようにする場合は「–numeric-suffixes=10」となります。

$ split -b 500M --numeric-suffixes=10 2G_data 2G_data.

サフィックスが「10」から始まっていることが確認できました。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:53 2G_data.10
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:53 2G_data.11
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:53 2G_data.12
-rw-rw-r-- 1 tamohiko tamohiko 524288000 May 13 15:53 2G_data.13
-rw-rw-r-- 1 tamohiko tamohiko  50331648 May 13 15:53 2G_data.14

-e

このオプションを指定すると、「-n」オプションを使用する場合に空のファイルを作成しません。

-l 行数で分割

指定した行数でファイルを分割します。

1000行あるテキストファイルを分割してみます。(wc -lコマンドでファイルの行数を表示することが出来ます)

$ wc -l testfile.txt
1000 testfile.txt

「-l」オプションで200行で分割させる指定をします。

$ split -l 200 testfile.txt testfile.txt.

分割後のファイルを「wc -l」コマンドで確認してみると、それぞれ200行ごとに分割されていることが確認できます。

$ wc -l testfile.txt.*
200 testfile.txt.aa
200 testfile.txt.ab
200 testfile.txt.ac
200 testfile.txt.ad
200 testfile.txt.ae
1000 total

-n 指定した数のファイルに分割

分割後のファイルの数を指定したい場合は「-n」オプションを使用します。

「-n 3」と設定すると、ファイルを3分割することが出来ます。

$ split -n 3 2G_data 2G_data.

分割後のファイルが3分割されていることが確認できます。

$ ls -l 2G_data.*
-rw-rw-r-- 1 tamohiko tamohiko 715827882 May 13 16:02 2G_data.aa
-rw-rw-r-- 1 tamohiko tamohiko 715827882 May 13 16:02 2G_data.ab
-rw-rw-r-- 1 tamohiko tamohiko 715827884 May 13 16:02 2G_data.ac

–verbose 分割状況の確認

「–verbose」オプションを使用すると、ファイルの分割状況が表示されるようになります。

$ split -l 100 --verbose testfile.txt testfile_
creating file ‘testfile_aa’
creating file ‘testfile_ab’
creating file ‘testfile_ac’
creating file ‘testfile_ad’
creating file ‘testfile_ae’
creating file ‘testfile_af’
creating file ‘testfile_ag’
creating file ‘testfile_ah’
creating file ‘testfile_ai’
creating file ‘testfile_aj’

このように分割されたファイルが作成されていく様子が表示されていきます。

ファイルの結合

「split」コマンドで分割されたファイルを結合するには、分割後のファイルを「cat」コマンドで表示させて、それをリダイレクトで結合後のファイルに書き込むという流れになります。

cat 分割ファイル* >> 結合後のファイル名

分割ファイルを指定する場合の注意点としては、分割ファイルの作成された順番通り(サフィックス順通り)に書き込むようにしてください。

結合例

実際に分割されたファイルから結合を行ってみます。

ファイルの分割

まずは、「testfile.txt」というファイルを分割します。

$ split -l 100 testfile.txt testfile.

下記が分割後のファイルとなります。

$ ls -l testfile.a*
-rw-rw-r-- 1 tamohiko tamohiko 292 May 13 23:10 testfile.aa
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ab
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ac
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ad
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ae
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.af
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ag
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ah
-rw-rw-r-- 1 tamohiko tamohiko 400 May 13 23:10 testfile.ai
-rw-rw-r-- 1 tamohiko tamohiko 401 May 13 23:10 testfile.aj

ファイルの結合

次に、分割後のファイルを統合していきます。

統合後のファイルは「testfile.txt.new」となります。

$ cat testfile.a* >> testfile.txt.new

データの同一性確認

統合されたファイルが分割前のファイルと同じ内容なのかは、分割前のファイルを「md5sum」等でハッシュ値を取得し、統合のファイルと比較することで確認することができます。

$ md5sum testfile.txt
53d025127ae99ab79e8502aae2d9bea6  testfile.txt

$ md5sum testfile.txt.new
53d025127ae99ab79e8502aae2d9bea6  testfile.txt.new

ハッシュ値が同じであれば、データは同一であるということになります。

コマンドの実行結果を分割する

「split」はコマンドの実行結果を「|(パイプ)」で渡すことで、内容を読み取り分割することもできます。

コマンド | split オプション - 分割後ファイル名

標準出力からデータを読み込む場合は分割元ファイルに「-」を指定します。

使用例

「ping」コマンドを100回実行した結果を「-l」オプションを使用して20行ごとに分割します。

$ ping -c 100 localhost | split -l 20 - ping.log.

実行結果は下記のように分割されて、ファイルに出力されています。

$ wc -l ping.log.*
  20 ping.log.aa
  20 ping.log.ab
  20 ping.log.ac
  20 ping.log.ad
  20 ping.log.ae
   5 ping.log.af
 105 total

シェアする