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


75

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 

私が間違っていることに関するアイデアはありますか?

回答:


103

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

zip -d gallery.zip "picture_43_9.jpg" 

以下からのジッパー(1)のmanページ:

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

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

は、エントリfoo/tom/junk、で始まる foo/harry/すべてのファイル、およびで終わるすべてのファイル.o(任意のパス)を削除します。なお、シェルのパス名展開は、バックスラッシュで阻害されているので、そのジッパーは有効、アスタリスクを見ることができるジップをの内容に適合するようにジップ代わりに現在のディレクトリの内容のアーカイブ。(バックスラッシュはMSDOSベースのプラットフォームでは使用されません。)クォートを使用して、アスタリスクをエスケープすることもできます。

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

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

MSDOSでは、zipアーカイブ内の名前と一致する場合、-dは大文字と小文字を区別します。このため、MSDOSシステムでPKZIPによって圧縮されたファイル名は大文字で入力する必要があります。(私たちは、パスが大文字と小文字を区別したシステムで、この場合は、小文字を区別しない作りと考えるが、アーカイブの場合は問題ないとアーカイブの両方を含めることができるシステムから来た可能性であると 、アーカイブ内の個別のファイルとして。)しかし、新しいオプションを参照してください-アーカイブ内の大文字小文字を無視するicBarbar


あなたは正しいです、ありがとう、zipのコマンドラインヘルプに混乱しました zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
アレックスフロ

@AlexFlo:マニュアルページのコピーが間違っている可能性があります。上記のコピーには「[ zipfile [ file… ]]」と書かれています。つまり、(a)ファイル名引数をまったく持たないことができます(ただし、助けを求めているとき以外は、どのように有効かはわかりませんが) )、(b)のZIPファイル(アーカイブファイル)名のみ、または(c)zipファイルに続いて一つ以上の通常のファイル名。(これらは、アーカイブに挿入される実際のファイルの名前、または操作されるアーカイブメンバーの名前になります。)
Scott

@AlexFlo- zip引用したmanページに記載されているように、STDINおよびpipeを介してファイル名引数を渡すことができます。たとえば、あなたが入っているディレクトリにいるならばfile1.txtfile2.txtfile3.txt、あなたが実行できるls -1 | zip -q 'files.zip' -@アーカイブ作成されている、files.zipあなたがにパイプ3つのファイル含むzip無傷で、ファイル名とします。
rubynorails
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.