split – ファイルを一定サイズ・行数・分割数で分割する

分割/結合

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=NN行ごとに分割(指定がなければ既定で1000行ごと)split -l 10000 access.log log-
-b SIZE, --bytes=SIZESIZEバイトごとに分割(K, M, G, KiB 等単位可)split -b 50M movie.mp4 part-
-C SIZE, --line-bytes=SIZE1ファイルあたり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 で実装依存の可否を確認してください。
  • 既定動作と命名
    • 入力・オプションなしでは 1000行ごとに分割し、xaa, xab, … のように英字サフィックス2桁で出力します(-a で桁数変更)。
    • 数値サフィックスは -d で有効化。桁数(-a)を十分大きくしてゼロ埋めすることで、ワイルドカード展開順のずれを防げます(例: 00, 01, ... 10)。
  • サイズ指定の単位(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 のように厳密に並べると安全です。

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント