split は、1つのファイル(または標準入力)を複数の小さなファイルに分割するコマンドです。
ログのローテーション、巨大CSVの分割、配布・アップロード前の分割などに使います。
実務では「10MBごと」「1万行ごと」「N等分」のように要件に合わせて分割し、後で cat で連結します。
構文(Syntax)
# 一般形(GNU coreutils)
split [OPTION...] [INPUT [PREFIX]]
# 例
split -b SIZE INPUT PREFIX # バイト数で分割
split -l LINES INPUT PREFIX # 行数で分割
split -n CHUNKS INPUT PREFIX # 等分(GNU 拡張)
INPUTを省略すると 標準入力を読みます。PREFIXを省略すると出力ファイルはxaa,xab, …(接頭辞x、英字サフィックス2桁)になります。PREFIXを指定すると、例:mylog.part-000のような連番名にできます(-d -aを併用)。
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-l N, --lines=N | N行ごとに分割(指定がなければ既定で1000行ごと) | split -l 10000 access.log log- |
-b SIZE, --bytes=SIZE | SIZEバイトごとに分割(K, M, G, KiB 等単位可) | split -b 50M movie.mp4 part- |
-C SIZE, --line-bytes=SIZE | 1ファイルあたりSIZEバイト以内で分割。ただし行は分割しない | split -C 5M big.csv csv- |
-n CHUNKS, --number=CHUNKS | 等分(GNU)。N=N等分、l/N=行数ベース、r/N=行をラウンドロビン | split -n l/4 data.csv piece- |
-a N, --suffix-length=N | サフィックス長を N 桁にする | split -b 10M -d -a 3 file.bin part- |
-d, --numeric-suffixes[=FROM] | サフィックスを数字に(必要なら起点 FROM 指定) | split -l 5000 -d -a 3 in.txt out- |
--additional-suffix=SUF | 追加の拡張子を付与 | split -b 100M -d out.img part- --additional-suffix=.bin |
-t SEP, --separator=SEP | 分割位置を SEP 区切りに合わせる(-n と併用, GNU) | split -n l/3 -t $'\n' data.txt part- |
--verbose | 生成した各ファイル名を逐次表示 | split --verbose -b 10M in.bin p- |
--help, --version | ヘルプ/バージョン表示 | split --help |
ヒント: 再結合は
cat PREFIX* > joinedで行えます。サフィックスのゼロ埋め(-d -a 3など)を使うと連結順の事故を防げます。
実行例
10MBごとに分割し、ゼロ埋めの数値連番で出力
説明: アップロード制限に合わせて10MB単位で分割します。
コマンド:
split -b 10M -d -a 3 backup.tar backup.tar.part-
ls backup.tar.part-*
出力例(例):
backup.tar.part-000 backup.tar.part-001 backup.tar.part-002 ...
再結合:
cat backup.tar.part-* > backup.tar
1万行ごとにログを分割(既定は1000行)
説明: 行数ベースで分割し、文字化けや行途中の分割を避けます。
コマンド:
split -l 10000 /var/log/access.log access.log.
ls access.log.*
出力例(例):
access.log.aa access.log.ab access.log.ac
行を壊さず、各ファイルの総バイト数を概ね5MB以内に
説明: -C は行の途中で切らないことが保証されます。
コマンド:
split -C 5M big.csv big.csv.part-
GNU拡張:CSVを「行数ベースで」4等分
説明: ほぼ同じ行数になるように等分します(GNU split)。
コマンド:
split -n l/4 data.csv -d -a 2 data.csv.part-
出力例(例):
data.csv.part-00 data.csv.part-01 data.csv.part-02 data.csv.part-03
標準入力から受け取りつつ分割(PREFIXを使いたい場合)
説明: パイプ入力でも分割できます。- を 入力ファイルの位置に置くと、その後ろを PREFIX と認識します。
コマンド:
gzip -dc huge.csv.gz | split -l 5000 - -d -a 3 huge.csv.part-
エラー例:存在しない入力ファイル
説明: 指定ファイルがないとエラーになります。
コマンド:
split no_such_file.txt
出力例:
split: no_such_file.txt: No such file or directory
関連コマンド
cat: 分割したファイルを連結して元に戻す。csplit: パターンや行番号に基づいて文書を論理的に分割する。tar: アーカイブ作成。splitと組み合わせて大容量配布を行う。head/tail: 先頭・末尾の行を確認(分割前の確認に便利)。wc: 行数・バイト数の確認(分割条件の見積りに)。gzip/xz: 圧縮。分割と組み合わせて「圧縮→分割」「分割→各片を圧縮」など。
備考
- GNU / BSD / BusyBox の違い
- GNU coreutils の
splitは-n,--numeric-suffixes,--additional-suffix,--separator,--verboseなどの拡張を持ちます。 - BSD/macOS の
splitにはこれらが無い場合があります(-n等)。移植性が必要なら-b,-l,-aの基本に絞ると安全です。 - BusyBox 版はオプションが限定的です。
--helpで実装依存の可否を確認してください。
- GNU coreutils の
- 既定動作と命名
- 入力・オプションなしでは 1000行ごとに分割し、
xaa,xab, … のように英字サフィックス2桁で出力します(-aで桁数変更)。 - 数値サフィックスは
-dで有効化。桁数(-a)を十分大きくしてゼロ埋めすることで、ワイルドカード展開順のずれを防げます(例:00, 01, ... 10)。
- 入力・オプションなしでは 1000行ごとに分割し、
- サイズ指定の単位(GNU)
1K,1M,1G(10進/2進の扱いは実装に依存)、1KiB,1MiBのような書式に対応。厳密な単位が必要なら KiB/MiB を推奨。
- 性能とI/O
- 多数の小ファイルは I/O 負荷や inode 消費が増えます。分割数やサイズは運用環境(FSの制限・アップロード制限)に合わせて計画してください。
- 再結合の注意
- 連結は生成順に
catすれば元に戻ります。シェルのグロブ順に依存するため、英字/ゼロ埋め連番を推奨。必要に応じてprintf '%s\0' PREFIX* | sort -z | xargs -0 cat > outのように厳密に並べると安全です。
- 連結は生成順に
参考
- manページ:
man 1 split - GNU coreutils
splitドキュメント: https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html - FreeBSD/macOS 版
split(man split、実装差分の確認に) - 併用例(連結):
man 1 cat

コメント