web-dev-qa-db-ja.com

Linux上のZipアーカイブから単一のファイルを削除する

Zipアーカイブ(-j -rフラグを付けてスクリプトで自動的に作成される)があり、そこから単一のファイルを削除したいのですが。文書化されたように私は試みました。

Zip -d "picture_43_9.jpg" gallery.Zip

しかし、私はこのエラーが出ます:

Zip warning: picture_43_9.jpg not found or empty   
Zip error: Nothing to do! (picture_43_9.jpg)  

とにかく、はアーカイブの中にのようなファイルがあり、空ではありません。

unzip -l .../gallery.Zip | grep -i 43_9.jpg  
1477092  2013-05-22 14:23   picture_43_9.jpg 

何がおかしいのですか?

68
Alex Flo

引数が入れ替わっています。これを試して:

Zip -d gallery.Zip "picture_43_9.jpg" 

Zip(1) のマニュアルページから:

-d
--delete
Zipアーカイブからエントリを削除(削除)します。例えば:

Zip  -d  foo  foo/tom/junk  foo/harry/\*  \*.o

エントリfoo/tom/junkfoo/harry/で始まるすべてのファイル、および.oで終わるすべてのファイルが(任意のパスで)削除されます。シェルのパス名展開はバックスラッシュで禁止されているため、Zipにアスタリスクが表示され、Zipが有効になります。現在のディレクトリの内容ではなく、Zipアーカイブの内容に一致します。 (円記号はMSDOSベースのプラットフォームでは使用されません。)また、引用符を使用してアスタリスクをエスケープすることもできます。

Zip -d foo foo/tom/junk "foo/harry/*" "*.o"

シェルがワイルドカードを展開するシステムでアスタリスクをエスケープしないと、アスタリスクが現在のディレクトリ内のファイルのリストに変換され、そのリストがアーカイブからエントリを削除するために使用される可能性があります。

MSDOSでは、Zipアーカイブ内の名前と一致する場合、 - dは大文字と小文字が区別されます。 MSDOSシステムでPKZIPで圧縮されている場合は、ファイル名を大文字で入力する必要があります。 (パスが大文字と小文字を区別しないシステムでは、この大文字と小文字を区別しないことを検討しましたが、大文字と小文字が区別されるシステムからアーカイブを取得し、アーカイブにBarbarをアーカイブ内の個別のファイルとして使用します。ただし、アーカイブ内の大文字と小文字の区別を無視するには、新しいオプション - icを参照してください。

91
jaypal singh