Exclui arquivos específicos de todos os subdiretórios ao criar um arquivo zip

Exclui arquivos específicos de todos os subdiretórios ao criar um arquivo zip

Quero excluir todos os arquivos .zip em todos os subdiretórios da pasta pai que estou compactando, mas não funciona. Eu verifiquei as man zippáginas,esseeesseperguntas sem sucesso.

Eu tentei:

zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x\*.zip
zip -q -r FILE.zip * -x */\.zip
zip -q -r FILE.zip * -x \*.zip
zip -q -r FILE.zip * -x \*.zip\*
zip -q -r FILE.zip * -x*.zip

e ainda recebo todos os arquivos zip incluídos (exceto aquele na pasta pai gerada com este comando antes).

EDIT: O problema é que eu já tinha um FILE.zip na pasta que incluía alguns arquivos zip. O zipcomandoatualizaçõesem vez decriaum novo arquivo compactado se o arquivo que ele tenta criar já existir, mesmo que você não indique a opção -u.

Responder1

Você precisa citar o padrão de exclusão, como já tentou fazer; O primeiro deve realmente funcionar, mesmo que exista uma solução “melhor”.

Mas vejamos um exemplo simplificado para trabalhar; Criei alguns diretórios com arquivos .fooe .barextensões:

Aqui corro findpara listar meu diretório de teste - ele mostra todos os arquivos e diretórios:

$ find
.
./1.bar
./1.foo
./sub1
./sub1/sub2
./sub1/sub2/1.bar
./sub1/sub2/1.foo
./sub1/1.foo
./sub1/1.bar

Agora, podemos apenas ver o que funciona
(tiramos o arquivo de saída do caminho, não é relevante para a correspondência).

Empacotando todos os arquivos:

$ zip -r /tmp/out.zip *          
  adding: 1.bar (stored 0%)
  adding: 1.foo (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/sub2/1.foo (stored 0%)
  adding: sub1/1.foo (stored 0%)
  adding: sub1/1.bar (stored 0%)

Embalagem excluindo .fooarquivos:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x '*.foo'
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

Funciona!
Tentando novamente com seu primeiro padrão:

$ rm /tmp/out.zip
$ zip -r /tmp/out.zip * -x \*.foo 
  adding: 1.bar (stored 0%)
  adding: sub1/ (stored 0%)
  adding: sub1/sub2/ (stored 0%)
  adding: sub1/sub2/1.bar (stored 0%)
  adding: sub1/1.bar (stored 0%)

Funciona também!

Então... dê uma olhada no que você realmente fez lá.

Primeiro você pode remover a -qopção "silêncio", ocultando as mensagens padrão mostradas nos meus exemplos.
Como próximo passo, adicione a -vopção "detalhado", para ver mais detalhes - talvez muitos, mas talvez você consiga identificar algo interessante.


Pelos comentários vejo que retirar o -qjá ajudou;

O problema subjacente era que o comando zip usado para teste foi modificado pela existência do arquivo de saída.
Tecnicamente, ele se modificou até...

Deman zip:

Command format.  The basic command format is

               zip options archive inpath inpath ...

        where archive is a new or existing zip archive and inpath is a directory or
        file path optionally including wildcards.  When given the name of an exist‐
        ing zip archive, zip will replace identically named entries in the zip  ar‐
        chive (matching the relative names as stored in the archive) or add entries
        for new names.

informação relacionada