Hapus satu file dari arsip zip di Linux

75

Saya memiliki arsip zip (dibuat secara otomatis dalam skrip dengan -j -rbendera) dan saya ingin menghapus satu file darinya. Saya mencoba seperti yang didokumentasikan.

zip -d "picture_43_9.jpg" gallery.zip

tapi saya mendapatkan kesalahan ini:

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

Pokoknya, ada adalah file seperti dalam arsip dan tidak kosong:

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

Ada gagasan tentang apa yang saya lakukan salah?

Alex Flo
sumber

Jawaban:

103

Argumen Anda sudah ditukar. Coba ini:

zip -d gallery.zip "picture_43_9.jpg" 

Dari halaman manual zip (1) :

-d
--delete
Hapus (hapus) entri dari arsip zip. Sebagai contoh:

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

akan menghapus entri foo/tom/junk, semua file yang dimulai dengan foo/harry/, dan semua file yang diakhiri dengan .o(di jalur apa pun). Perhatikan bahwa ekspansi shell pathname telah dihambat dengan garis miring terbalik, sehingga zip dapat melihat tanda bintang, memungkinkan zip untuk mencocokkan pada konten arsip zip alih-alih isi direktori saat ini. (Garis miring terbalik tidak digunakan pada platform berbasis MSDOS.) Dapat juga menggunakan tanda kutip untuk menghindari tanda bintang seperti pada

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

Tidak melarikan diri tanda bintang pada sistem di mana shell memperluas wildcard dapat mengakibatkan tanda bintang dikonversi ke daftar file di direktori saat ini dan daftar yang digunakan untuk menghapus entri dari arsip.

Di bawah MSDOS, -d peka huruf besar-kecil ketika cocok dengan nama dalam arsip zip . Ini mengharuskan nama file dimasukkan dalam huruf besar jika zip oleh PKZIP pada sistem MSDOS. (Kami menganggap membuat kasus ini tidak peka pada sistem yang jalurnya tidak peka terhadap huruf besar-kecil, tetapi ada kemungkinan arsip tersebut berasal dari sistem di mana kasus menjadi penting dan arsip dapat menyertakan keduanya Bardan bar sebagai file terpisah dalam arsip.) Tetapi lihat opsi baru - ic untuk mengabaikan case dalam arsip.

jaypal singh
sumber
Anda benar, terima kasih, saya bingung dengan bantuan baris perintah zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@AlexFlo: Anda mungkin memiliki salinan halaman manual yang buruk. Salinan yang dikutip di atas mengatakan "[ filefile [ file ... ]]", yang berarti Anda dapat memiliki (a) tidak ada argumen nama file sama sekali (walaupun saya tidak tahu bagaimana itu bisa valid, selain ketika Anda meminta bantuan ), (b) nama zipfile (file arsip) saja, atau (c) nama zipfile diikuti oleh satu atau lebih nama file biasa. (Ini bisa berupa nama-nama file aktual yang akan dimasukkan ke dalam arsip, atau nama-nama anggota arsip yang akan dimanipulasi.)
Scott
@AlexFlo - Anda dapat meneruskan argumen nama file melalui STDIN dan pipe to zip, sebagaimana dinyatakan dalam halaman manual yang Anda kutip. Misalnya, jika Anda berada di direktori yang berisi file1.txt,, file2.txtdan file3.txt, Anda dapat mengeksekusi ls -1 | zip -q 'files.zip' -@, yang akan membuat arsip yang files.zipberisi 3 file yang Anda perpip zipdengan nama file mereka utuh.
rubynorails