Удалить определенное имя файла в нескольких ZIP-файлах

У меня около 800 ZIP-файлов. Я следую этому вопросу, чтобы удалить файл внутри каждого файла. Как удалить несколько файлов внутри нескольких ZIP-файлов?

Я пытался

find /myfolder -iname '*.zip' -print0|xargs -0 -i zip -d photo1.jpg 

Но он возвращается с ошибкой

 xargs: zip: No such file or directory 

Я уверен, что помещаю файлы в правильный каталог. Кто-нибудь может мне с этим помочь?

Очень ценю ваш ответ. Благодаря,

Пытаться:

 find /myfolder -iname '*.zip' -exec zip -d {} photo1.jpg \; 

Заметки:

  1. Общий -print0/xargs хорош, но опция -exec find исключает необходимость в конвейере.

  2. Имя zip-файла должно быть до имени файла для удаления.

Если вы предпочитаете трубопровод, попробуйте:

 find /myfolder -iname '*.zip' -print0 | xargs -0 -i zip -d {} photo1.jpg 

Или, поскольку -i устарел:

 find /myfolder -iname '*.zip' -print0 | xargs -0 -I{} zip -d {} photo1.jpg 

Удаление файлов из подкаталогов zip

Вышеуказанные команды будут удалять только photo1.jpg если он находится в корневом каталоге zip-файла. Чтобы удалить photo1.jpg из любого и всех подкаталогов внутри zip:

 find /myfolder -iname '*.zip' -print0 | xargs -0 -I{} zip -d {} '*/photo1.jpg' 

Заметки:

  1. Для получения достоверных результатов при использовании подстановочного символа типа * важно указать имя файла внутри кавычек, чтобы glob передавался непосредственно в zip. В противном случае существует опасность, что оболочка может найти совпадение и расшифровать имя пути до того, как имя будет передано в zip .

  2. Существует большая разница между /*photo1.jpg и */photo1.jpg . Первая приведет к удалению всех файлов, имена которых заканчиваются на photo1.jpg . Сюда входят имена файлов, такие как abcphoto1.jpg . Последний будет удалять только файлы, фактически названные photo1.jpg .

Я нашел окончательное решение этой проблемы. Команда ниже удалит весь файл в zip и его всех подкаталогах с определенным именем файла.

 find /myfolder -iname '*.zip' -print0 | xargs -0 -i zip -d {} /*photo1.jpg 

Просто добавьте /* перед именем файла, чтобы удалить определенный файл или /*.extension чтобы удалить все файлы с этим расширением.

Давайте будем гением компьютера.