Tente:
find /myfolder -iname '*.zip' -exec zip -d {} photo1.jpg \;
Notas:
-
A abordagem geral de
-print0/xargs
é boa, mas a opção-exec
do find elimina a necessidade de um pipeline. -
O nome do arquivo zip deve estar antes do nome do arquivo a ser excluído.
Se você preferir o pipeline, tente:
find /myfolder -iname '*.zip' -print0 | xargs -0 -i zip -d {} photo1.jpg
Ou, como -i
está obsoleto:
find /myfolder -iname '*.zip' -print0 | xargs -0 -I{} zip -d {} photo1.jpg
Excluindo arquivos dos subdiretórios de um zip
Os comandos acima só excluirão photo1.jpg
se ele estiver no diretório raiz do arquivo zip. Para excluir photo1.jpg
de qualquer subdiretório dentro do zip:
find /myfolder -iname '*.zip' -print0 | xargs -0 -I{} zip -d {} '*/photo1.jpg'
Notas:
-
Para obter resultados confiáveis ao usar um curinga como
*
, é importante colocar o nome do arquivo entre aspas para que o glob seja passado diretamente para o zip. Caso contrário, há um risco de que o shell possa encontrar uma correspondência e fazer a expansão do nome do caminho antes de o nome ser entregue azip
. -
Existe uma grande diferença entre
/*photo1.jpg
e*/photo1.jpg
. O primeiro resultará na exclusão de todos os arquivos cujos nomes terminam comphoto1.jpg
. Isso inclui nomes de arquivos, comoabcphoto1.jpg
. O último excluirá somente os arquivos realmente denominadosphoto1.jpg
.