splitコマンドは文字通り、ひとつのファイルを複数のファイルたちへ“スプリット=分割”してくれるコマンド。テキスト/バイナリ両データに対応。元はUNIXコマンドであるためLinuxはもちろん、macOSでもデフォルトで利用可能。ここではmacOS版のsplitコマンドをご紹介。
どんな時に有効か
ファイルサイズの制限に引っかかってしまい、ファイル移動やコピーなどの操作が出来ない場合に有効。
具体的には、scpコマンドでリモートサーバへセキュアにデータを送りたいが、ファイルサイズ制限に引っかかってしまい送信できないケース、あるいはFAT32でフォーマットしてしまったUSBメモリへ4GB以上のファイルを保存させたいときなど、たまに遭遇するこういった問題を解決してくれる素晴らしいコマンドである。
よく使うであろう用法
split [-b ファイルサイズ] 入力ファイル名 [接頭辞]
角括弧に括られた範囲はオプションである。-bに続けてbyte単位で分割後のファイルサイズを指定。“100k”や“20m”のように小文字のkやmを使うことでキロバイトやメガバイトでの指定も可能。また、分割後のファイルたちの名前先頭(接頭辞)を任意の文字列にする場合は接頭辞に文字列を入力。なお、接頭辞はデフォルト/無指定だとxとなる。
例
例えばここに3.09GBの“Raspberry Pi Desktop”ISOイメージファイルがある。
raspios-buster-i386.iso
これをひとつ約500MBのファイルたちへ分割するには次のコマンドを走らせる。
split -b 500m raspios-buster-i386.iso raspios_
-bオプションは500MB、接頭辞は`raspios_`とした。さて、これで次のようなファイルたちが姿を現す。
- raspios_aa
- raspios_ab
- raspios_ac
- raspios_ad
- raspios_ae
- raspios_af
これが分割後のファイル群。接頭辞に続くファイル名は2桁のアルファベットの連番であるが、これについては後述する。なお、拡張子は無い。さて、ひとつひとつのファイルサイズを調べたところ、指定サイズよりもやや大きかったことが判明。どうやら厳密に指定バイト数未満に収めたい場合は予めやや小さな値を指定すると吉だろう。
ファイルを元に戻す
分割したのは良いが、大切なのはこれらを再びひとつの元ファイルへ戻すこと。これにはお馴染みのcatコマンドを使う。
cat raspios_* > raspios-buster-i386.iso
ワイルドカードで分割された全ファイルを読み込み、その結果をraspios-buster-i386.isoというファイル名へ出力(保存)している。ワイルドカードを使って正しい順序で結合できるようにするため、splitが出力するファイルたちの名前末尾はアルファベットの連番になっていたのだった。
テキストファイルで使える小技
split -l 行数 入力ファイル名 [接頭辞]
splitコマンドには-lという、テキストファイルの分割時に便利な行数指定オプションがある。例えば1,000行あるCSVファイルを100行づつのファイルへ分割することも出来る。このように。
split -l 100 address.csv address_
これで`address.csv`の頭から100行づつ分割されたファイルたちが出力される。無論、分割された各ファイルに拡張子を付与すれば、すべてCSVファイルとして扱える。
GNU版のsplitコマンドだと、ファイル名末尾をアルファベットの連番だけでなく数字の連番へ変更できたり、接頭辞だけでなく接尾辞の指定も出来たりするため、出力ファイルたちに拡張子を付与させることも出来たりするのだが、macOS版のsplitコマンドにはそこまでの機能が無く、ミニマルである。そのため分割後のファイルに拡張子を付与したいならばawkコマンドと併用する、あるいはFinder機能を活用、具体的には複数ファイルを選択してから“名前を変更”するなど、工夫をすると良い。
覚えておくといつの日か、役に立つ時が来るかもしれない…。
あとがき: もともとが複数のファイルであったりフォルダであったりしたらzipやtarなどアーカイブ化することでひとつのファイルとして扱えるようになるので、それをsplitすることが出来る。ちなみに話は全く関係なくなるが、インターネットでLinux/GNU版splitコマンドのmanページ(マニュアル)を読もうと思い“man split”と検索したところ、開脚(split)した男性の画像がいっぱい出てきて驚いた。そうか、と。文字って面白いなぁ、と思う昨今である。