Linuxのsplitコマンドは指定したサイズにファイルを分割する
2020/08/24
splitコマンドでファイルを指定したサイズに分割する
splitは指定したサイズにファイルを分割する
Linuxのテキストを操作するコマンドの紹介として、今回は「split」コマンドを紹介します。
splitコマンドはファイルを指定したサイズに分割します。
例えば、
error.logのファイルが GB単位の大きなファイルになってしまい、エラーの内容を確認するときにもトラブルが発生する、と言うようなときに、error.logを 10MB単位のファイルに分割する、と言った場合や
zipファイルが大きすぎてメールで送信するのには問題があるため、ファイルを分割してから送信する。受信した側で分割したファイルを結合して元に戻してもらう、と言った場合
に使います。
「split」コマンドは、指定した行数だけ表示する「head」「tail」コマンドや、テキストファイルをページ単位で表示する「more」「less」コマンドとは違い、実際にファイルを小さく分割して、ファイルの操作をしやすくすることができます。
ちなみに、splitコマンドで分割したファイルは、catコマンドなどで結合します。
これについては後ほど解説します。
ファイルを指定したサイズで分割する「split」コマンド
「split」コマンドは、指定されたサイズでファイルを分割します。
splitコマンドの基本的な使用例
「split」コマンドの基本的な使用例としては以下のようになります。
ログファイル(error.log)などの大きなファイルを指定したサイズに分割するときなどに使用します。
1 2 3 4 5 6 |
$ split -b 10M error.log error.log- $ls -lh -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aa -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ab -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ac -rw-rw-r--. 1 admin admin 1.1M 6月 6 14:22 error.log-ad |
ここでは「-b 10M」を指定していますので、10MB単位(1024の累乗)で分割しています。
分割後のファイル名は「error.log-」と指定していますので、この「error.log-」に「aa」「ab」「ac」...と順番に付与されたファイル名で生成されていきます。
1 |
$ split error.log |
また、上記のように、分割サイズも分割後のファイル名も指定しなかった場合は、デフォルトのサイズ設定は「1000行」となっていますので、1000行を 1ファイルとして分割します。
また、分割後のファイル名は、デフォルトでは「x」が設定されていますので、それに接尾辞が「aa」「ab」「ac」と付与されていきますので、実際のファイル名は「xaa」「xab」「xac」...として作成されていきます。
splitで分割したファイルは catコマンドで結合する
分割したファイルを連結する場合は「cat」コマンドを使用します。
1 |
$ cat error.log-aa error.log-ab error.log-ac error.log-ad > error.log2 |
上記のように明示的にファイルを記述する方法もありますが、下記のようにメタキャラクタを使って複数のファイルをまとめて指定する方法もあります。
1 |
$ cat error.log-?? > error.log2 |
catコマンドについて下記に記事を書いていますので、あわせて参考にしてください。
Linuxでファイルの内容を表示するcatコマンドの解説。more、lessで代替も
splitコマンドのオプションについて
「split」コマンドのオプションとしては、下記のものがあります。
大きく分けて、ファイルを分割する条件を指定するオプション、分割して作成される接尾辞を指定するオプション、その他、です。
オプション | 説明 |
---|---|
-b、–bytes=サイズ | 分割するファイルのサイズを指定する |
-l、–line=行数 | 分割する行数を指定する |
-C、–line-bytes=サイズ | 分割ファイルに含める行の最大サイズを指定する |
-a、–suffix-length=長さ | 接尾辞の長さを指定する |
-d、–numeric-suffixes | 接尾辞を英字ではなく数字にする |
–additional-suffix=文字列 | ファイル名の末尾に文字列を追加する |
-n、–number=個数 | 指定した数のファイルに分割する |
-e、elide-empty-files | -nオプション使用時に空のファイルを作成しない(-nで指定するファイルサイズに対して大きな値を指定すると空のファイルができることがある) |
-u、–unbuffered | -nオプション使用時にバッファリングしないで入力を出力にコピーする |
–filter=コマンド | コマンドに対してファイル名を出力する |
–verbose | 出力ファイルを開く前に診断メッセージを表示する |
-bオプションで分割するファイルのサイズを指定する
最初の基本的な使用例で紹介しましたが、「-b」オプションは、分割するファイルのサイズを指定する際に使用します。
1 2 3 4 5 6 |
$ split -b 10M error.log error.log- $ls -lh -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aa -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ab -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ac -rw-rw-r--. 1 admin admin 1.1M 6月 6 14:22 error.log-ad |
ここでは「-b 10M」を指定していますので、10MB単位(1024の累乗)で分割しています。
分割後のファイル名は「error.log-」と指定していますので、この「error.log-」に「aa」「ab」「ac」...と順番に付与されたファイル名で生成されていきます。
この例では、「10M」を指定していますので、1ファイルのサイズは 10MBとなります。
ここで言う「10MB」は「10 × 1024 × 1024」です。
「10 × 1000 × 1000」で区切りたい場合は、「10MB」を指定する必要があります。
同様に、K、M、G、T、P、E、Z、Yを単位として指定した場合は、「1024」の累乗となります。
また、KB、MB、GB、TB、PB、EB、ZB、YBの単位を指定した場合は、「1000」の累乗となります。
ただし、「-b」オプションの欠点は、指定のサイズになった場所でファイルを分割するため、行の途中であってもファイルを分割する点です。
そのため、上記の「error.log」の場合は、行の途中でファイルが分割されている場合もあるのです。
メールで送信するためにファイルを分割し、あとから結合して使うような場合は「-b」オプションで全く問題ありませんが、分割したファイルを分割したファイルとして活用する場合には行単位で分割してほしいと思う場合もあります。
そんなときに使用するのが、次項の「-C」オプションです。
-Cオプションで分割するファイルのサイズを指定するが、改行を考慮する
前項の「-b」オプションは、行の途中であるか否かを区別せず、指定したサイズでファイルを分割します。
ですが、「-C」オプションでは、改行を意識して、指定したサイズより大きくならないようにファイルを分割してくれます。
例えば、1001行目で指定の 10MBを超えるならば、1000行目までで 1つのファイルになるように分割してくれます。
そのため、ログファイルのように分割したあとのファイルを利用する場合は、行単位で分割してくれる「-C」オプションの方が便利です。
コマンドの記述形式は「-b」と同じです。
1 2 3 4 5 6 7 |
$ split -C 10MB error.log error.log- $ls -l error.log-* -rw-rw-r--. 1 admin admin 9987413 6月 6 16:27 error.log-aa -rw-rw-r--. 1 admin admin 9988456 6月 6 16:27 error.log-ab -rw-rw-r--. 1 admin admin 9912544 6月 6 16:27 error.log-ac : : |
「-C」では行単位でファイルを分割しますので、指定したサイズできっちり分割されることは多くありません。
また、「-b」オプションと同じく「MB」などの単位付きのサイズを指定することもできるようになっています。
-lオプションで分割するファイルの行数を指定する
前々項の「-b」オプションはファイルサイズで分割しましたが、「-l」では行数で分割を行います。
1 2 3 4 5 6 7 8 9 10 |
$ split -l 1000 error.log error.log- $ls -l error.log-* -rw-rw-r--. 1 admin admin 103096 6月 6 15:22 error.log-aa -rw-rw-r--. 1 admin admin 104015 6月 6 15:22 error.log-ab -rw-rw-r--. 1 admin admin 95884 6月 6 15:22 error.log-ac : : $ wc -l xaa 1000 xaa |
上記では「1000(行)」を指定していますが、オプションを指定しない場合は、上記の「-l 1000」が指定されたものとしてします。
「wc」コマンドは、文字数や行数をカウントするコマンドで、「-l」オプションを使用することでファイルの行数を表示します。
wcコマンドについて下記に記事を書いていますので、あわせて参考にしてください。
Linuxの wcコマンドでファイルの行数、単語数、バイト数、文字数をカウントする
「-l」オプションでは、「-b」オプションと異なり、「1K」「1MB」といった単位付きの指定をすることはできません。
-nオプションで分割するファイルの数を指定する
前項までで解説したオプションは、分割するファイルをサイズ、行数で指定する方式でしたが、「-n」オプションは、分割後のファイルの数を指定する方式です。
具体例としては、下記のように「-n 3
」を指定すると、ファイルサイズが全く同じ 3ファイルに分割します。
1 |
$ split -n 3 error.log |
上記の方法では、「-b」オプションと同じように改行位置とは無関係にファイルを分割しますので、「-C」のように改行位置に合わせて分割したい場合は「-n l/3
」のように数値の前に「l/
(エル、スラッシュ)」を追加します。
1 |
$ split -n l/3 error.log |
また、分割するファイルのうち、指定した箇所のみ出力する方法も用意されています。
1 2 |
$ split -n 2/3 error.log > error-2-3.log $ split -n l/2/3 error.log > error-2-3l.log |
上記の例では「-n 3
」を指定すると、ファイルを 3分割し 3ファイルを作成します。
しかし、実際には 3分割したうちの 2ファイル目の範囲の情報があれば足りる、という場合は、その 2ファイル目だけ出力する、という方法があります。
それが、「 -n 2/3
」のように「3」の前に「2/」を追記する方法で、3分割したうちの 2番目の部分のみを標準出力します。
これをリダイレクトを使って「error-2-3.log」に出力をしています。
ちなみに、ここでも「l/
(エル、スラッシュ)」を追記して行単位で分割することもできます。
-aオプションで分割するファイルの接尾辞の長さを指定する
前項までのオプションは、ファイルを分割する条件を指定するオプションでしたが、ここからは分割したファイルに付与される接尾辞を指定するためのオプションです。
最初の「-a」オプションは、接尾時の長さを指定します。
デフォルトでは接尾時は「aa」「ab」「ac」...と付与されますが、これは「-a 2
」が設定されている状態と同じ、2文字となっています。
下記の例では、接尾辞を 4文字にする設定です。
1 2 3 4 5 6 |
$ split -b 10M -a 4 error.log error.log- $ls -lh -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aaaa -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aaab -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aaac -rw-rw-r--. 1 admin admin 1.1M 6月 6 14:22 error.log-aaad |
ちなみに、分割するファイルに対して、接尾辞が足りなくなる場合は下記のようにエラーメッセージが表示されます。
1 2 |
$ split -b 1M -a 1 error.log error.log- split: 出力ファイルの接尾辞を使い果たしました |
ただし、接尾辞を使い果たすまでの部分については分割されてファイルに出力されています。
(error.log-a、error.log-b、error.log-c...のファイルは作成されています。)
-dオプションで分割するファイルの接尾辞を数字にする
splitコマンドで分割するファイルには「aa」「ab」「ac」のようにアルファベットを接尾辞として使用します。
ですが、これを数値にしたい場合は、下記のように「-d」オプションを指定します。
1 2 3 4 5 6 |
$ split -b 10M -d error.log error.log- $ls -lh -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-01 -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-02 -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-03 -rw-rw-r--. 1 admin admin 1.1M 6月 6 14:22 error.log-04 |
下記のように「-a」オプションも加え、接尾時の桁数を指定しながら数値に変更することもできます。
1 |
$ split -b 10M -d -a 4 error.log error.log- |
「–additional-suffix=」オプションで接尾辞の後ろに文字列を追加する
splitで分割したファイルのファイル名は、最後に接尾辞が付与されます。
しかし、その接尾時のさらに後ろになにか共通の文字列を追加したい、という場合は「–additional-suffix=」オプションを使用します。
例えば、下記の例では、作成されるファイルに「.log」という拡張子を追加しています。
1 2 3 4 5 6 |
$ split -b 10M --additional-suffix=.log error.log error.log- $ls -lh -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-aa.log -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ab.log -rw-rw-r--. 1 admin admin 10M 6月 6 14:22 error.log-ac.log -rw-rw-r--. 1 admin admin 1.1M 6月 6 14:22 error.log-ad.log |
「–verbose」オプションで処理のメッセージを表示する
splitコマンドは、ファイル分割実行時には何もメッセージを表示しませんが、作成したファイルの情報を表示するオプションが「–verbose」です。
具体的には、下記のように「–verbose」オプションを追加すると、作成したファイルの情報が逐次表示されます。
1 2 3 4 5 |
$ split -b 10M --verbose error.log error.log- ファイル `error.log-aa' を作成しています ファイル `error.log-ab' を作成しています ファイル `error.log-ac' を作成しています ファイル `error.log-ad' を作成しています |
「–verbose」オプションには短縮形がないのがちょっと残念な感じがします。
head、tailコマンドでファイルの先頭、末尾を表示する
今回は「error.log」をサンプルに、大きくなったエラーログを分割する想定で「split」コマンドについて解説をしましたが、ファイルを分割するのではなく、ファイルの先頭や最後の部分を一時的に確認したい、という場合もあるでしょう。
そんなときは、head、tailコマンドがあります。
headコマンドはファイルの先頭から指定の行数分を表示するというコマンドで、tailコマンドはファイルの最終行から指定の行数文を表示するというコマンドです。
例えば、ファイル容量が大きすぎて viコマンドなどで表示するには重たすぎる場合は、下記のように head、tailコマンドを使って 100行だけ表示させる、という方法を取ることもできます。
1 2 |
$ head -n 100 error.log $ tail -n 100 error.log |
また、head、tailコマンドは、その結果を標準出力しますので、ファイルに出力したい場合はリダイレクトを使用します。
1 |
$ head -n 100 error.log > error_head_100.log |
head、tailコマンドに関しては、下記に詳細記事を書いていますのであわせて参考にしてください。
Linuxのheadコマンドは先頭行から、tailコマンドは最終行から指定した行を表示する
more、lessコマンドでページ単位でファイルを表示する
前項の head、tailコマンドでは、先頭行、最終行から指定した行を表示しますが、それだけではよく分からない、という場合は、more、lessというページャーコマンドを使う方法もあります。
下記のように使うことで、指定したファイルの内容をページ単位で画面表示をします。
これにより、大きなファイルであっても重たくならずに画面表示を行うことができます。
1 2 |
$ more error.log $ less error.log |
more、lessはページャーとして、下記のように他のコマンドの結果の表示をページ単位で表示する際に組み合わせて使うことが多いのですが、コマンド単体でファイルを表示する機能を持っていますので、上記のように直接ファイルを指定することも可能です。
1 2 |
$ cat error.log | more $ cat error.log | less |
more、lessコマンドに関しては、下記に詳細記事を書いていますのであわせて参考にしてください。
Linuxでファイルの内容を表示するcatコマンドの解説。more、lessで代替も
catコマンドに関しては、下記に詳細記事を書いていますのであわせて参考にしてください。
less、moreはページャー、ファイルの中身を表示するLinuxのコマンド
今回の記事では、ファイルを分割する「split」コマンドについて解説をしましたが、ファイルの内容、および、テキスト情報についての操作に関連するコマンドは下記の記事にまとめていますので、あわせて参考にしてください。
cat、less、head、tail、split、sedなどLinuxでファイル、文字列を操作するコマンド
GoogleAdwords
GoogleAdwords
この記事が参考になったと思いましたらソーシャルメディアで共有していただけると嬉しいです!
関連記事
-
UNIX・Linuxの sedコマンドで特定の文字列を置換する方法
UNIX・Linuxのコマンドで特定の文字列を置換する sedコマンドの使い方と、perlコマンドを使っての方法を解説しています。
-
Linuxのコマンドの情報を調べるwhich、whereis、whatis、apropos、man
Linuxのコマンドの実行ファイルやマニュアルの情報を確認するコマンドwhich、whereis、whatis、apropos、manの機能と使い方、似たところと違うところの紹介。
-
Linuxのheadコマンドは先頭行から、tailコマンドは最終行から指定した行を表示する
Linuxのhead、tailコマンドはファイルの先頭の一部、もしくは、末行の一部を表示するコマンド。行数や文字数で指定をする。tailはログを監視するためのオプションがある。
-
Linuxのnlは行番号を付与してファイルの内容を表示するコマンド
Linuxでファイルを表示する際に行番号を付与するにはcatコマンドにnオプションを使うことでも可能。しかし、行番号を付与する専門のnlコマンドがある。ここではその使い方を詳細に解説。
-
less、moreはページャー、ファイルの中身を表示するLinuxのコマンド
Linuxにはコマンドで実行した結果が長い場合、1画面ごとに区切って表示するコマンドが用意されている。それがページャーと呼ばれるmore、lessだ。この使い方を解説。
-
Linuxのファイル表示・結合catの逆処理のtac、revコマンドの解説
Linuxにtac、revというコマンドがある。catの逆の処理なのだが、tacは最終行から逆に表示し、revは行末の文字から逆に表示をすることを解説しつつその使い方について詳しく解説をする。
-
Linuxの環境変数でパスの設定をする方法とシェル変数の扱い方を解説
Linuxでコマンドを設置するパスの設定情報である環境変数「PATH」の確認方法と環境変数「PATH」に新しいパスを追加する方法の解説。Linuxのシェルでの変数の扱い方についての解説も。
-
Linuxのマニュアルページ表示コマンドmanの解説
Linuxにはコマンド操作のオンラインマニュアルが用意されています。そのマニュアルを表示するコマンドが「man」です。「man」コマンドの使い方について解説します。
-
Linuxで使用される主な環境変数・PATH、HOME、PS1・printenv、set、declare
Linuxに設定されている主な環境変数の解説。PWD、HOSTNAME、USER、LANG、HOME、LOGNAME、PS1、PS2、HISTSIZE、HISTFILE、HISTFILESIZE、TERMなどがある。
-
Linuxのbashのコマンドの履歴をhistoryで確認し!、↓、↑で実行する
Linuxで実行したコマンドの履歴を確認するコマンド「history」。「history」の使い方、設定の変更、設定ファイルの設置場所について解説。「!番号」「!文字列」「!?文字列」など。