プロが教えるわが家の防犯対策術!

ZIPファイル内の特定のファイルのみ抽出してZIPファイルを作成
したいのですが、パイプ等を使ってうまくできないでしょうか?

次のようにコマンドをいくつかあわせればとりあえず出来るのですが…
mkdir temp
unzip src.zip *.jpg -d temp
cd temp
zip -m ..\dst.zip *

もっとよい方法をご存知の方がいましたらご教授願います。

次のようにも試してみたのですが、うまくいきませんでした。
unzip -p src.zip *.jpg | zip dst.zip -

OSはWindowsXPです。
ZIPプログラムは必要であれば特定のZIPプログラムを
使用してもいいです。

A 回答 (2件)

ANo.1 です。


そうですね。簡単なコマンドですむ方法はむずかしいかもしれませんね。
それでは、思いついたことをいくつか。

(1) zip 内のファイルを削除する方法の場合。
新しい zip ファイルを 3 個つくるなら、3 個以上のコマンドが必要でしょう。

copy src.zip 1.zip & zip -d 1.zip "*" -x "?.jpg" "??.jpg" "???.jpg"
copy src.zip 1000.zip & zip -d 1000.zip "*" -x "1???.jpg"
copy src.zip 2000.zip & zip -d 2000.zip "*" -x "2???.jpg"

上の 3 行を 1 行につないでもよいのでしょうが、ややこしくなるだけでしょう。
ファイル名が簡単なワイルドカードで表せる場合は、これでどうでしょうか。

(2) *.jpg のファイル名が簡単なワイルドカードで指定できない場合。
(たとえば数字といっしょにアルファベットが混じるファイル名があって、それは zip ファイルにしたくないとか)
ファイル名がいろいろあって簡単に指定できない場合は、ファイル名のリストを作っておくのがわかりやすいでしょう。
ファイル名がわからないときは
zipinfo -1 src.zip "1???.jpg" > 1000.lst
などとしていったんリストを作って、余計なファイルが混じるならあとで編集するなどの手間が必要かもしれません。
そのうえで、unzip でひとつずつ展開して、そのたびに zip でアーカイブに加えていくとかは、どうでしょう。

for /f %i in (dst.lst) do (
unzip src.zip %i
zip -m dst.zip %i
)

バッチファイルにして、dst のところを 1 とか 1000 とか 2000 とかのコマンドライン・パラメータで与えるのもいいかもしれません。
ファイル名の番号に規則性があるならリストファイルにしないで、
for /l %i in (1 1 999)
などと、連続した番号を生成するのもありかなと思います。
    • good
    • 0
この回答へのお礼

遅い返答ですみませんが・・・・

最後のループする方法は思いつきませんでした。
これは使えそうです!
ありがとうございました!!!

お礼日時:2008/01/17 12:22

zip -d src.zip "*" -xi "*.jpg"


これでどうでしょうか (InfoZIP の場合) src.zip から *.jpg 以外が削除されます (src.zip は変更されます)

unzip と zip を組み合わせてパイプでつなぐのは、うまくいかないと思います。
質問欄にも
> うまくいきません
とありますが、どううまくいかないのか書いてありませんので、以下は想像です。
zip は各ファイルを圧縮してからアーカイブするので (アーカイブ化したひとつのファイルを圧縮するわけではない) それぞれのファイル名とタイムスタンプ、アトリビュートなどの情報が必要だと思います。
それに、パイプで複数ファイルを渡すと、つながってしまいます。JPEG 画像の場合、最初の画像の EOI (end of image) マーカ以降は無視されるので、最初の画像しか見えなくなるのではないでしょうか。

この回答への補足

本当は「番号.jpg」が複数入ったZIPファイルを例えば
~999番→1.zip
1000番台→1000.zip
2000番台→2000.zip
のように小さく分けたZIPファイルにしたいのです。

なので、削除する方法もあまりこの場合は効率的ではありません。
しかし、完璧な方法はないのかもしれませんね。

補足日時:2007/12/04 01:28
    • good
    • 0
この回答へのお礼

なるほど、変則的ですが、他のファイルを削除することによって
特定のファイルのZIPを作るという方法がありますね。

パイプで上手くいかない理由はたぶん、その通りだと思います。

お礼日時:2007/12/04 01:26

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!