Удалить один файл из zip-архива в Linux

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" 

Со страницы руководства zip (1) :

-d
--delete
Удалить (удалить) записи из zip-архива. Например:

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

удалит запись foo/tom/junk, все файлы, которые начинаются с foo/harry/, и все файлы, которые заканчиваются .o(в любом пути). Обратите внимание, что расширение имени пути оболочки было запрещено с помощью обратной косой черты, поэтому zip может видеть звездочки, позволяя zip соответствовать содержимому архива zip вместо содержимого текущего каталога. (Обратные косые черты не используются на платформах на основе MSDOS.) Также можно использовать кавычки для экранирования звездочек, как в

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

Невозможность избежать звездочек в системе, в которой оболочка расширяет символы подстановки, может привести к преобразованию звездочек в список файлов в текущем каталоге и этот список, используемый для удаления записей из архива.

В MSDOS -d чувствительна к регистру, когда совпадает с именами в zip- архиве. Для этого необходимо, чтобы имена файлов вводились в верхнем регистре, если они были заархивированы PKZIP в системе MSDOS. (Мы рассматривали вопрос о том, чтобы сделать этот регистр нечувствительным в системах, в которых пути были нечувствительны к регистру, но возможно, что архив поступил из системы, в которой регистр имеет значение, и архив может включать в себя как Barи bar отдельные файлы в архиве.) Но посмотрите новую опцию - ic, чтобы игнорировать регистр в архиве.

Джайпал Сингх
источник
Вы правы, спасибо, я запутался в помощи командной строки zip zip [-options] [-b path] [-t mmddyyyy] [-n suffixes] [zipfile list] [-xi list]
Alex Flo
@AlexFlo: у вас может быть плохая копия справочной страницы. В приведенной выше копии написано «[ zipfile [ file… ]]», что означает, что вы не можете иметь (a) никаких аргументов в имени файла (хотя я не знаю, как это может быть действительным, за исключением случаев, когда вы обращаетесь за помощью). ), (b) только имя zipfile (архивный файл) или (c) имя zipfile, за которым следуют одно или несколько обычных имен файлов. (Это могут быть имена фактических файлов, которые будут вставлены в архив, или имена членов архива, которыми нужно манипулировать.)
Скотт
@AlexFlo - Вы можете передавать аргументы имени файла через STDIN и pipe zip, как указано в man-странице, которую вы цитировали. Например, если вы находитесь в каталоге , содержащем file1.txt, file2.txtи file3.txtвы можете выполнить ls -1 | zip -q 'files.zip' -@, что позволит создать архив , files.zipсодержащий 3 файлы по конвейеру zipс их именами файлов нетронутыми.
Rubynorails