ファイル一個なら
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 &
$ ls *.xyz.gz | xargs -n1 -I{} gzip -d {} &
$ ls *.xyz.bz2 | xargs -n1 -I{} bzip2 -d {} &
でOK.
$ ls *.xz | xargs -n1 -I{} xz -dk {} &
てことになった。-k は「元ファイルも残す」(keep) の意味。その他オプションについては http://tukaikta.blog135.fc2.com/blog-entry-223.html#xz 参照。Windows でも cygwin からこれやった方が explzh よりも余計なダイアログとかでないので楽だわ。
UPDATE 2015-02-19
結局全部 xz にすることにした。ので解凍は$ ls *.xz | xargs -n1 -I{} xz -dk {} &
そのほか
試しに Poderosa から cygwin でやってみたら問題なく動作した。まぁディレクトリの移動が面倒だけど、たぶん explzh 使うより動作が軽い(気がする)。
xargs には -P (parallel?) オプションがあって並列実行もできるようなのだけれど、「一つのファイルを寄ってたかって圧縮」したいのではなくて、「適当に4つずつなど圧縮していきたい」ので、やりたはまだわからない。
No comments:
Post a Comment