Пытаться:
find /myfolder -iname '*.zip' -exec zip -d {} photo1.jpg \;
Заметки:
Общий -print0/xargs
хорош, но опция find -exec
устраняет необходимость в конвейере.
Имя 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'
Заметки:
Для получения надежных результатов при использовании подстановочного знака, такого как *
, важно поместить имя файла в кавычки, чтобы глобус передавался непосредственно в zip. В противном случае существует риск, что оболочка может найти совпадение и выполнить расширение пути до того, как имя будет передано zip
.
Существует большая разница между /*photo1.jpg
и */photo1.jpg
. Первый приведет к удалению всех файлов, имена которых заканчиваются на photo1.jpg
. Это включает в себя имена файлов, такие как abcphoto1.jpg
. Последний будет удалять только файлы с именем photo1.jpg
.