[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

5.3 split: ファイルを分割する。

split は、入力ファイル input を分割して複数の出力ファイルを作成する。 各出力ファイルには、input の断片が、連続した形で、 あるいは 1 行づつ順番に分配された形で含まれることになる (訳注: 前者は単純な分割であり、 後者は後述の「ラウンド・ロビン方式」である。‘-n’ オプションを参照)。 input が指定されていない場合や、‘-’ である場合には、標準入力から読み込む。

書式:

 
split [option] [input [prefix]]

デフォルトでは、splitinput を 1000 行づつ各出力ファイルに書き込む (最後の断片については、何行であれ残っている行を書き込む)。

出力ファイルの名前は、上記書式の prefix (デフォルトでは ‘x’) に複数の文字 (デフォルトでは、‘aa’, ‘ab’, …) を続けたものであり、各出力ファイルをファイル名による伝統的なソート順で結合すると、 元の入力ファイルが再構成されるようになっている (ただし、‘-nr/n’ オプションを指定した場合は除く)。 デフォルトでは、split はまず、作成するファイルに 2 文字からなる接尾辞 (訳注: suffix、すなわち上記の ‘aa’, ‘ab’ など) を生成して付け、 その接尾辞の 1 番目の文字がアルファベットの最後に達した時点で、接尾辞を 2 文字づつ増やして行く (‘yz’ の次は ‘zaaa’, ‘zaab’, … という具合)。 こうした命名法を使えば、出力ファイルがいくつあっても対応できるし、また ‘--additional-suffix’ オプションを付けたときでも、 出力ファイルが上で述べたような順に並ぶことになるわけだ。 ‘-a’ オプションが指定されている場合に、出力ファイルの名前が種切れになってしまうと、 split はエラーメッセージを出すが、作成した出力ファイルを消去することはない。

このプログラムでは以下のオプションが使用できる。参照: 共通オプション.

-l lines
--lines=lines

input から lines 行づつ各出力ファイルに書き込む。 ‘--separator’ オプションが指定されている場合は、lines はレコード数の指定になる。

互換性を考慮して、split は ‘-lines’ という古いオプションの書式もサポートしている。新規にスクリプトを書くなら、 ‘-l lines’ の方を使うべきである。

-b size
--bytes=size

input から size バイトづつ各出力ファイルに書き込む。 size は、整数であり、 以下に挙げるような何倍かを示す接尾辞を後ろに付けることもできる。接尾辞だけ指定してもよい (訳注: その場合は、1 が前にあるものと見なされる)。

 
b’  =>            512 ("blocks")
‘KB’ =>           1000 (KiloBytes)
‘K’  =>           1024 (KibiBytes)
‘MB’ =>      1000*1000 (MegaBytes)
‘M’  =>      1024*1024 (MebiBytes)
‘GB’ => 1000*1000*1000 (GigaBytes)
‘G’  => 1024*1024*1024 (GibiBytes)

T’, ‘P’, ‘E’, ‘Z’, ‘Y’ についても同様。

-C size
--line-bytes=size

各出力ファイルに、ファイルサイズが size バイトを超過しない範囲で、 input の完全な行をできるだけ多く書き込む。 一つの行やレコードの長さが size バイトを越える場合は、複数のファイルに分割される。 size の書式は、‘--bytes’ オプションの場合と同じである。 ‘--separator’ オプションが指定されている場合は、 できるだけ多くの行ではなく、できるだけ多くのレコードを書き込むことになる。

--filter=command

このオプションを使用すると、各出力は、そのままファイルに書き出されるのではなく、 パイプを通して一つづつ、指定されたシェルコマンド command に引き渡される。command 中では、環境変数 $FILE を使用するべきであり、 この変数には、シェルコマンドを実行するごとに、異なる出力ファイル名が代入される。 たとえば、1TiB の圧縮ファイルがあるとしよう。伸長したら、サイズが大きすぎて、 ディスクに納まり切らない。しかし、それを分割して、もっと扱いやすいサイズの、 それぞれ圧縮したファイルを作らねばならない。そうした課題を解決するには、 次のようなコマンドを実行すればよいだろう。

 
xz -dc BIG.xz | split -b200G --filter='xz > $FILE.xz' - big-

圧縮率が 10:1 だとすると、上のコマンドは 20GiB のファイルを 50 個ほど生成することになるだろう。ファイルの名前は、‘big-aa.xz’, ‘big-ab.xz’, ‘big-ac.xz’ などになる。

-n chunks
--number=chunks

inputchunks 個の出力ファイルに分割する。 chunks の位置には以下のものが指定できる。

 
n      input の現在のサイズに基づいて n 個のファイルを生成する。
k/n    n 個中の k 番目のみを標準出力へ出力する。
l/n    n 個のファイルを生成する。行やレコードの途中で分割しない。
l/k/n  同上。ただし、n 個中の k 番目のみを標準出力に出力する。
r/nl’ に似ている。ただし、分配はラウンド・ロビン方式で行う。
       (訳注: トランプの親がカードを 1 枚づつ子に配るように、
               入力から 1 行 (1 レコード) づつ各出力ファイルに
               分配して行く。)
r/k/n  同上。ただし、n 個中の k 番目のみを標準出力に出力する。

inputn 個の「部分 (chunk)」に分けたときに出た余りのバイトは、 最後の「部分」に割り振られる。最初に行われる分割のための計算の後で追加されるバイトがあっても、 それは捨て去られる (‘r’ モードを使用している場合を除く)。

input の行数が n 行に足りなかったり、input が短縮された場合でも、 n 個のファイルすべてが作成される。

l’ モードについて言うと、「部分」の大きさは、「input サイズ / n」前後になる。 input は、まず n 個の同一サイズの区画 (partition) に分割され、 余りがあれば、それは最後の区画に割り当てられる。 ある行の先頭が、ある区画の内側にある場合、その行は行末まで、その区画に対応するファイルに書き込まれる。 行やレコードは、たとえ後続する区画にまではみ出していても分割されないので、 書き出されるファイルは、区画のサイズより大きくなることもあれば、小さくなることもある。 行やレコードが後続する区画をすっぽり覆ってしまうほど長い場合には、空っぽのファイルができることさえある。

r’ モードでは、input のサイズは問題にならない。だから、入力は、 たとえば、パイプからであっても構わない。

-a length
--suffix-length=length

使用する接尾辞の長さを length 文字にする。length に 0 を指定すると、‘-a’ オプションを (すでに指定していた場合でも) 全く指定しなかったのと同じことになり、従って、デフォルトの動作が有効になる。 すなわち、接尾辞は、2 文字から始まり、‘-n’ や ‘--numeric-suffixes=from’ オプションが指定されていないかぎり、 必要になるごとに、2 文字づつ自動的に増えて行く。

-d
--numeric-suffixes[=from]

接尾辞にアルファベットの小文字ではなく、数字を使用する。 数字の接尾辞は、 from が指定されていれば from から、 指定されていなければ 0 から数を数えて行く。

from を指定できるのは、長い形式のオプションを使ったときだけである。 from を指定すると、split を一回だけ実行する場合に最初の接尾辞を決めたり、 それぞれ別々にスプリットする入力に対して相互の接尾辞間をどれくらい離すかを決めたりすることができるが、 上で述べた接尾辞の長さを自動的に増やしていく機能は無効になる。 そこで、ユーザとしては、‘99’ を越える数字を接尾辞として使えるようにするため、 ‘-a’ オプションも併せて指定したくなるかもしれない。 なお、‘--number’ オプションが指定され、しかも、生成されるファイルの数より from が小さい場合は、一回かぎりの実行と見なされ、接尾辞に最小限必要な長さが、自動的に割り出される。

(訳注: 上記の「なお」以下で言っているのは、‘split -d -n100 some.data’ などとすると、x00 から x99 までのファイルが作られるが、‘split --numeric-suffixes=1 -n100 some.data’ なら、x001 から x100 まで、3 桁の接尾辞を持つファイルが作られるということらしい。 しかし、coreutils 8.26 では、‘split -d -n200 some.data’ や ‘split --numeric-suffixes=10 -n100 some.data’ は、 "output file suffixes exhausted" というエラーになる。 そして、‘split -d -n201 some.data’ や ‘split --numeric-suffixes=10 -n101 some.data’ なら、実行に成功するのである。よくわからない仕様だと思う。‘--suffix-length’ を使って、自分で接尾辞の長さを決めた方が、間違いがない。)

--additional-suffix=suffix

出力ファイル名の末尾に suffix をさらに追加する。 suffix 中にスラッシュが含まれていてはならない。

-e
--elide-empty-files

サイズ 0 の出力ファイルができないようにする。そうしたものが生成されることがあるのは、 ‘--number’ を使ったときである。入力ファイルが (短縮されたりして) 指定された数の出力ファイルを作るには分量が足りない場合や、 1 行が長すぎて、後続する「部分」をすっぽり飲み込んでしまっている場合などがそれに当たる。 このオプションが指定されているときでも、出力ファイルの連続番号が、 順番に増えていくことに変わりはない。

-t separator
--separator=separator

レコード・セパレータとしてデフォルトの改行文字 (ASCII LF) の代わりに、 文字 separator を使用する。ASCII NUL をセパレータに指定するには、 二文字からなる文字列 ‘\0’ を使用すればよい。‘split -t '\0'’ のようにだ。

-u
--unbuffered

--number r/…’ モードにおいて入力を即座に出力する。 このモードは、作業にかなり時間がかかるのだ。

--verbose

各出力ファイルをオープンする直前に、診断メッセージを表示する。

終了ステータス 0 は成功を示し、0 以外の値は失敗を示す。

--number’ (‘-n’) の動作を理解していただくために、 用例をいくつか挙げてみる。

デフォルトでは、1 行が 2 行以上に分割されることがあるのに、注目していただきたい。

 
$ seq -w 6 10 > k; split -n3 k; head xa?
==> xaa <==
06
07
==> xab <==

08
0
==> xac <==
9
10

"l/" 修飾子を使用して、行の途中で分割しないようにする。

 
$ seq -w 6 10 > k; split -nl/3 k; head xa?
==> xaa <==
06
07

==> xab <==
08
09

==> xac <==
10

"r/" 修飾子を使用して、ラウンド・ロビン方式で分配する。

 
$ seq -w 6 10 > k; split -nr/3 k; head xa?
==> xaa <==
06
09

==> xab <==
07
10

==> xac <==
08

K 番目の「部分」だけ取り出すこともできる。次の例は、33 の「部分」に分け、 そのうちの 7 番目だけを取り出して、表示している。

 
$ seq 100 > k; split -nl/7/33 k
20
21
22

[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated on June 7, 2022 using texi2html 1.82.