読者です 読者をやめる 読者になる 読者になる

連番ファイルを個別に xz で圧縮/解凍

linux

natures flyers: コマンドライン (linux, cygwin) での個別ファイルのバッチ圧縮解凍 → xargs使う に書いたんだけどゴチャゴチャしてるので、必要な部分のみメモ。

前提

  • ファイル名は 00001.xyz, 00002.xyz, ... だったとする。 00001.q の場合は下記の .xyz を .q に変えれば良い。
  • ファイルはそれぞれがでかいため個別に圧縮することにする。まとめて一つのアーカイブにしたい場合は tar を使ってください

圧縮

元ファイルを消す場合

$ ls *.xyz | xargs -n1 -I{} xz {} &

元ファイルを残す場合

$ ls *.xyz | xargs -n1 -I{} xz -k {} &

解凍

アーカイブファイルを消す場合

$ ls *.xz | xargs -n1 -I{} xz -d {} &

アーカイブファイルを残す場合

$ ls *.xz | xargs -n1 -I{} xz -dk {} &

応用

上では簡単のため、ファイルのあるディレクトリに移動した後にコマンド実行するケースを想定した。しかし、いちいち cd するのは面倒なので、もっと上層から ls ./foo/bar/output/*.xyz のようにやってもよい。さらにいうと、たとえば計算結果が複数のケースにわたって

  • ./case1/output/00001.xyz , ./case1/output/00002.xyz , ...
  • ./case2/output/00001.xyz , ./case2/output/00002.xyz , ...

のようにあって、ディレクトリ構造が同じであれば、

$ ls ./case*/output/*.xyz | xargs -n1 -I{} xz {} &

で一気に圧縮できる。

このように、アステリスクでのワイルドカードはかなり便利なので、なるべくディレクトリ(フォルダ)名は連番とか構造を保つような名前にしておくとよい。

ただし、マルチスレッドで同時に(並行に)圧縮したい場合はわざとバラバラにジョブを投入するべき。計算機じゃなくて普段使いのPCの場合1スレッドは残しとかないと動作がかなり重くなるで注意。