【Linux】splitコマンドで巨大なファイルを分割・復元する

目次

概要

1つの大きなファイルを、指定した行数やサイズごとの複数の小さなファイルに分割するコマンドです。

メールの添付ファイル容量制限を回避したり、FAT32などのファイルサイズ制限(4GB)があるメディアに巨大なデータを保存したりする際に役立ちます。分割されたファイルは cat コマンドを使って簡単に元のファイルへ復元(結合)できます。

仕様(引数・オプション)

構文

split [オプション] [入力ファイル] [出力プレフィックス]

主な引数・オプション

オプション説明
-l <行数>指定した行数ごとにファイルを分割します(デフォルトは1000行)。
-b <サイズ>指定したバイトサイズごとに分割します(例: 10m, 500k)。
-d分割後のファイル名の末尾(サフィックス)を、英字ではなく数字(00, 01…)にします。
-a <桁数>サフィックスの桁数を指定します(デフォルトは2桁)。
--verbose分割されたファイル名を作成されるたびに表示します。
--additional-suffix=<文字列>分割後のファイル名の末尾に、指定した文字列(拡張子など)を追加します。
-C <サイズ>指定したサイズを超えない範囲で、行単位で(行を分断せずに)分割します。

基本の使い方

オプションを指定せずに実行すると、入力ファイルを「1000行ごと」に分割し、xaa, xab, xac… という名前で出力します。

コマンド

# bigdata.log を1000行ずつ分割(出力ファイル名は xaa, xab... となる)
split --verbose bigdata.log

実行結果

creating file 'xaa'
creating file 'xab'
creating file 'xac'

実践コマンド

バイナリファイルを分割し、結合して復元する

ここでは、ls コマンド(バイナリ)をテキストデータに変換(uuencode)してから分割し、それを再度結合して元の実行ファイルに戻せるかを検証する一連の流れを紹介します。

uuencode コマンドがない場合は、sudo apt install sharutils (Ubuntu/Debian) や sudo yum install sharutils (CentOS/RHEL) でインストールしてください。

1. テスト用ファイルの準備

/bin/ls コマンドをテキストエンコードして、テストファイル ls.uuencode を作成します。

# /bin/ls をエンコードしてファイル化
uuencode -m - < /bin/ls > ls.uuencode

# 行数を確認(数千行あることを確認)
wc -l ls.uuencode

2. ファイルを分割する

分かりやすいように「数字の連番(-d)」を使用し、「ls-」というプレフィックス(接頭辞)を付けます。

# 数値サフィックス(-d)を使い、"ls-" から始まる名前で分割
split --verbose -d ls.uuencode ls-
creating file 'ls-00'
creating file 'ls-01'
creating file 'ls-02'
...

3. 分割状態の確認

生成されたファイルの行数を確認します。

wc -l ls-*

4. ファイルの結合(復元)と検証

分割されたファイルを cat コマンドで一つにまとめ、元のファイルと差分がないか確認した後、デコードして実行できるかテストします。

# ワイルドカードでまとめて結合
cat ls-* > ls.merge

# 元ファイルと結合ファイルの差分を確認(何も出なければ一致)
diff ls.uuencode ls.merge

# マージしたファイルをデコードしてバイナリに戻す
uudecode ls.merge > ls

# 実行権限を付与して実行テスト
chmod +x ls
./ls --version
ls (GNU coreutils) 8.32 ...
(lsコマンドとして正常に動作すれば成功です)

カスタムポイント

  • サイズ指定分割: ログファイルなどではなく、圧縮ファイルやディスクイメージを分割する場合は、行数ではなくサイズ指定(-b)を使います。
    • 例: split -b 100M large_video.mp4 video_part_
  • 拡張子の維持: 分割後もテキストエディタで開きやすくするために --additional-suffix=.txt などを付けると便利です。

注意点

  1. 結合時の順番:cat ls-* > merge のようにワイルドカードを使う場合、シェルはアルファベット/数値順にファイルを展開します。ls-9 と ls-10 がある場合、環境によっては 10 が先に来てしまう可能性があるため、桁数(-a)を十分確保するか、-d(00, 01…)を使用することが重要です。
  2. ディスク容量:分割処理は「元のファイルを残したまま、新しいファイルを生成」します。つまり、一時的に元のファイルサイズの2倍のディスク容量が必要です。
  3. 行の分断リスク:テキストファイルを -b(バイト指定)で分割すると、行の途中でファイルが切れてしまい、結合せずに単体で見ようとした際に文字化けや構文エラーの原因になります。テキストの場合は -l(行数)または -C(行を考慮したサイズ)を使用してください。

応用

ログファイルを行を壊さずに容量ベースで分割する

「1ファイルあたり約10MBにしたいが、行の途中で切れるのは困る」という場合に -C オプションが役立ちます。

# 1ファイルあたり最大10MB(10MBを超えないキリの良い行)で分割
split -C 10M --verbose --numeric-suffixes app.log app_part_

まとめ

splitコマンドは、ネットワーク転送制限やストレージ仕様の壁を越えるためのシンプルな解決策です。「分割は split、結合は cat」というペアで覚えておけば、どのような巨大ファイルでも安全にハンドリングできます。特にバックアップデータの分割管理や、巨大なCSVファイルの並列処理前の準備などで頻繁に利用されます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次