Linuxのコマンドで、圧縮しながら一定のファイルサイズで分割できるコマンドを紹介します。
出力されるファイルサイズに制限がある時に、使用したりします。
レジュメ
環境・前提条件
- Linuxカーネルバージョン 4.14
- Linuxディストリビューション不明
レンタルサーバーのロリポップで、毎日cronでzipバックアップを行っていたのですが、
ある日突然、zip作成が失敗するようになりました。
確認したところ、一定のファイル出力を行うと、プロセスがkilledされてしまうようでした。
そこで、zipコマンドの代わりに、今回の圧縮しながらファイル分割をするコマンドを実施しエラーを回避しました。
結論、tarとsplitコマンドで圧縮しながら出力ファイルをファイルサイズでファイル分割する
tar czvf - (圧縮元フォルダ名) | split -d -b 1G - (圧縮先ファイル名).tar.gz
tarコマンドで圧縮しながら、パイプでsplitコマンドで渡し同時にファイル分割します。
こちらの方法で、ロリポップサーバー上の出力ファイルサイズ制限問題をクリアしました。
オプションについては、以下で説明します。
tarコマンドのczvfオプション
アーカイブコマンドのtarコマンドはオプションが多く、いつも毎回調べないと忘れてします。
今回のczvfはよく使うオプションですね。
- c: アーカイブの作成 Create
- z: 圧縮にgzipを使用 gZip
- v: アーカイブ・圧縮中のファイルリストを画面に詳細出力 Verbose
- f: 出力先ファイルを指定する File
fオプションをしていた場合は、その後ろの「アーカイブファイル名」を記載。
fオプションのアーカイブファイル名を「-」とした場合は、出力をパイプにつないでくれる。
czvfから解凍しアーカイブを取り出すオプションは、xzvf。
czvfのアーカイブの中身が何が入っているか見るオプションは、tzvf。
splitコマンドのオプション
- -d: 接尾辞を英字ではなく 0 で始まる数字にする
- -b: 出力ファイル毎の大きさを SIZE バイトにする
-bオプションのサイズの単位には、
KB 1000, K 1024, MB 1000*1000, M 1024*1024, and so on for G, T, P, E, Z, Y.
が使用出来る。
圧縮分割ファイルされたtar.gzを解凍してアーカイブから取り出す方法
cat 分割ファイル名(連番)* | tar xzvf -
上記のように分割されたファイルをアスタリスクでcatでつないでも、
catで順番に分割されたファイルを指定してもOK。
その順番通り結合された内容を、パイプでtarにつなぎxzvfで取り出す。
取り出すときは、カレントディレクトリに出力されるが、
-Cオプションを指定すれば出力先も指定できる。
【注意】zip圧縮には最大容量制限がある
実は、zipの圧縮には最大容量制限があるので注意が必要です。
厄介なのは圧縮は正常に出来るが解凍できない
という点ですね。まさに注意が必要ですね。
- 圧縮前のファイルサイズが合計4GBを超える場合
- 圧縮後のファイルサイズが2GBを超える場合
このファイルサイズになった場合は、扱いに注意しましょう。
zip64形式ならば上記ファイルサイズを超えて使用出来ますが、まだ対応していないケースも多いようなので、ファイルサイズが大きい圧縮の場合はzipを使用しない方が良いでしょう。