Видаліть один файл із 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 [ файл… ]]", що означає, що у вас можуть бути (а) аргументи назви файлів взагалі (хоча я не знаю, як це може бути дійсним, крім випадків, коли ви звертаєтесь за допомогою ), (b) лише ім'я zipfile (архівний файл) або (c) ім'я zipfile, за яким слідують одне або більше звичайних імен файлів. (Це можуть бути імена фактичних файлів, які потрібно вставити в архів, або імена членів архіву, якими слід маніпулювати.)
Скотт

@AlexFlo - Ви можете передавати аргументи назви файлів за допомогою STDIN та трубопроводу zip, як зазначено на сторінці людини, яку ви цитували. Наприклад, якщо ви знаходитесь в каталозі, що містить file1.txt, file2.txtі file3.txt, ви можете виконати ls -1 | zip -q 'files.zip' -@, що створить архів, files.zipщо містить 3 файли, до яких ви переклали файли, zipз їх недоторканими іменами.
рубінові перила
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.