Exclui o nome do arquivo específico em vários arquivos ZIP

1

Eu tenho cerca de 800 arquivos zip. Eu seguindo esta pergunta para excluir o arquivo dentro de cada arquivo. Como excluir vários arquivos dentro de vários arquivos Zip?

Eu tentei

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

Mas ele retorna com erro

xargs: zip: No such file or directory

Tenho certeza de que coloquei os arquivos no diretório correto. Alguém pode me ajudar com isso?

Aprecie muito com sua resposta. Obrigado,

    
por Sambath DreamHigh 12.08.2016 / 08:04

2 respostas

0

Tente:

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

Notas:

  1. A abordagem geral de -print0/xargs é boa, mas a opção -exec do find elimina a necessidade de um pipeline.

  2. 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:

  1. 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 a zip .

  2. Existe uma grande diferença entre /*photo1.jpg e */photo1.jpg . O primeiro resultará na exclusão de todos os arquivos cujos nomes terminam com photo1.jpg . Isso inclui nomes de arquivos, como abcphoto1.jpg . O último excluirá somente os arquivos realmente denominados photo1.jpg .

por 12.08.2016 / 08:15
0

Eu encontrei a solução final para este problema. O comando abaixo irá apagar todo o arquivo no zip e todos os subdiretórios com o nome do arquivo específico.

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

Basta adicionar /* antes do nome do arquivo para excluir um arquivo específico ou /*.extension para excluir todos os arquivos com essa extensão.

    
por 12.08.2016 / 14:41