2015-01-20

コマンドライン (linux, cygwin) での個別ファイルのバッチ圧縮解凍 → xargs使う

Windows なら explzh でもできるけど、linux 計算機上で圧縮してサイズ縮めてからローカルに転送したいので。

ファイル一個なら
http://qiita.com/wnoguchi/items/cb0fa7c11b119e96f1e5
http://tukaikta.blog135.fc2.com/blog-entry-223.html
にある通り。

でも今は、複数のファイルを個別に、だがバッチで一括して圧縮したい。
⇒ http://extrea.hatenablog.com/entry/2012/10/14/234932 コレダ!

噂に聞いていた xargs を使うのか。
Man page of xargs によると -i は非推奨らしいので、 -I{} とした方がいいようだが、基本的にはこれでよいようだ。あとちょっとググると ls でなく find 利用が多いようだが、自分の場合はまぁ ls と *.拡張子で間に合ってるのでまぁいいや。

一応自分用にメモしておく。いずれも、「元のファイルは消す」設定なので要注意。(xargs の中でリダイレクト > を使うのがうまくできなかったのもある…あとで調べるか)

UPDATE 2015-01-21

すでに同名のファイルがある場合、 tar なら黙って上書きする(したくない場合は -k オプション)が gzip, bzip2 はお行儀よく(?)上書きしない。これは困るので、 -f オプションを追加した。

UPDATE 2015-01-24

バックグラウンドに行ってくれないとうざいので末尾に & を追加した。

圧縮

対象とするファイル: 0001.xyz, 0002.xyz, ...のような拡張子のもの全て

$ ls *.xyz | xargs -n1 -I{} tar cfvz {}.tar.gz {} &

意味としては、パイプの左で 0001.xyz が出力され、それが xargs に渡される、というか要は tar での {} の部分にこれが代入される。 -n1 の部分が「ファイルを個別に」になっている。

…というか、ファイルを個別に、なので tar いらなくね?→やってみた

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

でも同じことだった。出てくるファイルが .tar.gz か .gz かの違いだけ。あ、リネームしたい場合は tar の方がいいのか。

あるいは圧縮率高いけど遅い bzip2 で

$ ls *.xyz | xargs -n1 -I{} tar cfvj {}.tar.bz2 {} &
$ ls *.xyz | xargs -n1 -I{} bzip2 -f {} &

こっちのほうがいいかも。今使ってるデータだと倍くらい違うことがある。


UPDATE 2015-01-24

bzip2 遅いわ。遅さが気になる用途なら gzip の方がいいし、気にならない場合ならむしろ xz の方がいいな。圧縮は遅くなるけど解凍は bzip2 より速いらしいし。
使い方は http://tukaikta.blog135.fc2.com/blog-entry-223.html

解凍

.tar.gz, .tar.bz2 なら

$ ls *.xyz.tar.gz | xargs -n1 -I{} tar xfvz &
$ ls *.xyz.tar.bz2 | xargs -n1 -I{} tar xfvj &

.gz, .bz2 のみなら

$ ls *.xyz.gz | xargs -n1 -I{} gzip -d {} &
$ ls *.xyz.bz2 | xargs -n1 -I{} bzip2 -d {} &

でOK.

UPDATE 2015-02-19

結局全部 xz にすることにした。ので解凍は

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

てことになった。-k は「元ファイルも残す」(keep) の意味。その他オプションについては http://tukaikta.blog135.fc2.com/blog-entry-223.html#xz 参照。Windows でも cygwin からこれやった方が explzh よりも余計なダイアログとかでないので楽だわ。

そのほか

試しに Poderosa から cygwin でやってみたら問題なく動作した。まぁディレクトリの移動が面倒だけど、たぶん explzh 使うより動作が軽い(気がする)。

xargs には -P (parallel?) オプションがあって並列実行もできるようなのだけれど、「一つのファイルを寄ってたかって圧縮」したいのではなくて、「適当に4つずつなど圧縮していきたい」ので、やりたはまだわからない。

No comments: