連番ファイルを個別に xz で圧縮/解凍
natures flyers: コマンドライン (linux, cygwin) での個別ファイルのバッチ圧縮解凍 → xargs使う に書いたんだけどゴチャゴチャしてるので、必要な部分のみメモ。
前提
圧縮
元ファイルを消す場合
$ 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スレッドは残しとかないと動作がかなり重くなるで注意。