はじめに

こんにちは!今回はsplitコマンドについて解説します。

splitは大きなファイルを複数の小さいファイルに分割するコマンドです。ログファイルが巨大すぎて処理しきれない、メールで送信するのに大きすぎる…そんな時に活躍します。

分割ファイルは自動で名前が付けられるので、あとで簡単に処理や転送ができますよ。

splitコマンドとは

splitは、ファイルを指定されたサイズ数や行数で分割するコマンドです。

大きなファイルを扱う時、ネットワークでの転送時、あるいはバックアップなど、様々な場面で活躍します。分割されたファイルはaaabacのような名前で自動生成されるので、あとでcatで連結することも簡単です。

基本構文

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

ファイルを指定しないと標準入力から読み込みます。

主なオプション

オプション 説明
-n NUM NUM個に分割
-l NUM NUM行ごとに分割
-b NUM NUMバイトごとに分割(例: -b 1M
-c NUM NUMバイトごとに分割(行の途中で切ることあり)
-d 数字をサフィックスに使用(デフォルトはアルファベット)
-a NUM サフィックスの長さを指定(デフォルトは2)
--verbose 分割の状況を表示

使用例

例1: ファイルを行数で分割

1
split -l 100 large.txt chunk_

実行結果:

1
2
3
chunk_aa
chunk_ab
chunk_ac

large.txtを100行ごとに分割します。chunk_aachunk_ab…のように名前が付きます。

例2: ファイルをサイズで分割

1
split -b 1M largefile.dat file_

実行結果:

1
2
3
file_aa
file_ab
file_ac

largefile.datを1MBごとに分割します。バイナリファイルの分割に便利です。

例3: 固定数に分割

1
split -n 4 data.csv result_

実行結果:

1
2
3
4
result_aa
result_ab
result_ac
result_ad

data.csvをちょうど4つのファイルに均等分割します。

例4: サフィックスに数字を使用

1
split -d -l 50 log.txt log_

実行結果:

1
2
3
log_00
log_01
log_02

デフォルトのアルファベット(aaab…)ではなく数字(0001…)を使用します。

例5: サフィックスの長さを指定

1
split -a 3 -l 100 data.txt part_

実行結果:

1
2
3
part_aaa
part_aab
part_aac

サフィックスを3文字にします。たくさんのファイルに分割する時に便利。

例6: KBやGBを指定

1
split -b 512K largefile file_

512KB単位で分割します。K(キロ)、M(メガ)、G(ギガ)が使えます。

例7: 標準入力から分割

1
cat huge.log | split -l 1000 - output_

パイプで接続したコマンドの出力を分割できます。

例8: 詳細情報を表示

1
split -n 5 --verbose bigdata.dat chunk_

実行結果:

1
2
3
4
5
creating file 'chunk_aa'
creating file 'chunk_ab'
creating file 'chunk_ac'
creating file 'chunk_ad'
creating file 'chunk_ae'

--verboseで分割状況が表示されます。

例9: CSVファイルをヘッダー付きで分割

1
2
head -1 data.csv > header.txt
tail -n +2 data.csv | split -l 100 - part_

CSVファイルをヘッダー付きで分割するテクニック。

例10: テキストファイルの分割と連結

1
2
split -l 1000 original.txt chunk_
cat chunk_* > reconstructed.txt

分割したファイルをcatで連結すれば、元のファイルが復元できます。

Tips・注意点

バイナリファイルには-bを使う

バイナリファイルを分割する時は、行ベースの-lではなく、バイトベース(-b-c)を使いましょう。

1
2
split -b 10M binary.bin bin_  # OK
split -l 100 binary.bin bin_   # 危ない!

-bと-cの違い

  • -b: 指定バイト数で必ず切る(行の途中で切ることもある)
  • -c: バイト数で切るが、行の途中では切らない(分割数が増える可能性)
1
2
split -b 100 file.txt part_  # ちょうど100バイト
split -c 100 file.txt part_  # 100バイト以下で、かつ行の途中で切らない

分割ファイルのサフィックスを統一する

複数ファイルを分割する時は、分割数のプレフィックスを統一しましょう。

1
2
split -d -a 4 file1.txt file1_  # 0000, 0001, ...
split -d -a 4 file2.txt file2_  # 0000, 0001, ...

実践的な使い方

ログファイルの分割

1
split -b 100M access.log log_archive_

巨大なアクセスログを100MB単位で分割して、アーカイブやバックアップに備える。

大容量ファイルの転送

1
2
3
split -b 500M backup.tar.gz backup_chunk_
# 転送後
cat backup_chunk_* > backup.tar.gz

大容量ファイルを分割してFTPで転送する場合に便利。

データベースダンプの分割

1
mysqldump --all-databases | split -b 50M - db_backup_

大規模データベースのダンプを分割して保存。

ログのローテーションと分割

1
split -n 3 --verbose /var/log/syslog syslog_parts_

システムログを複数のパーツに分割してアーカイブ。

まとめ

splitコマンドのポイント:

  • 大きなファイルを複数に分割 する便利なコマンド
  • -l: 行数で分割(テキストファイル向け)
  • -b: バイトで分割(バイナリファイル向け)
  • -n: 固定数に均等分割
  • -d: 数字をサフィックスに使用
  • 分割したファイルはcatで連結して復元可能

ネットワーク転送やバックアップ、データ処理など、様々な場面で活躍するコマンドです。大きなファイルを扱う時は、とりあえずsplitを思い出してください!