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

1

Eu quero excluir todos os arquivos .zip em todos os subdiretórios da pasta pai que estou compactando, mas não funciona. Eu verifiquei as páginas man zip , this e this questions 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 o da 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 comando zip atualiza em vez de cria um novo arquivo compactado se o arquivo que ele tenta criar já existir, mesmo se você não indicar a opção -u.

    
por Community 27.08.2014 / 23:33

1 resposta

2

Você precisa citar o padrão de exclusão, como você já tentou fazer; O primeiro deve realmente funcionar, mesmo se houver uma solução "melhor".

Mas vamos ver um exemplo simplificado para trabalhar; Criei alguns diretórios com arquivos com .foo e .bar extensions:

Aqui eu corro find para 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 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 .foo arquivos:

$ 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%)

Works!
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 opção -q de "quiet", ocultando as mensagens padrão mostradas em meus exemplos.
Como próximo passo, adicione a opção -v para "verbose", para ver mais detalhes - talvez muitos, mas talvez você possa identificar algo interessante.

Dos comentários, vejo que remover o -q já 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 mesmo ...

De man 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.
    
por Volker Siegel 28.08.2014 / 01:26