Como encontrar uma lista de arquivos e compactá-los em um único arquivo zip?

2

Eu quero coletar todos os arquivos que usei em um projeto. Eu estou usando o comando find , e eu quero que ele encontre uma lista de arquivos e depois eu passe o resultado para o comando zip para criar um único arquivo zip contendo todos os arquivos correspondentes. Apenas uma conveniência, se for possível. No entanto, parece que há problemas com isso e não funciona.

find /lmms/samples/ -name warp01*,JR_effect2k*,clean_low_key*,q_kick_2*,sticky_q_kick*,upright_bass*,pizzi*,chorded_perc*,Tr77_kick*,Tr77_tom1*,Tr77_cym*,hihat_008a*,Hat_o.ds,Hat_c.ds,Kickhard.ds,Tr77_snare* -exec zip {} ~/Desktop/files.zip

A saída é:

find: missing argument to '-exec'

PS.

Depois de corrigir alguns erros apontados nas respostas abaixo e seguindo suas diretrizes, reformatei o código conforme abaixo:

find ~/lmms/samples/ (-name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*)  -exec zip -add  ~/Desktop/files.zip {} +

Ainda falha com a mensagem bash: syntax error near unexpected token (' '

Remover os parênteses elimina o erro, mas parece adicionar apenas um arquivo ao arquivo, o que, surpreendentemente, parece não encontrar na minha área de trabalho !!!

 find ~/lmms/samples/ -name warp01* -o -name JR_effect2k* -or -name clean_low_key* -or -name q_kick_2* -or -name sticky_q_kick* -or -name upright_bass*-or  -name pizzi* -or -name chorded_perc* -or -name Tr77_kick* -or -name Tr77_tom1* -or -name Tr77_cym* -or -name hihat_008a* -or -name Hat_o.ds -or -name Hat_c.ds -or -name Kickhard.ds -or  -name Tr77_snare*  -exec zip  ~/Desktop/files.zip {} +
  adding: home/john/lmms/samples/drumsynth/tr77/Tr77_snare.ds (deflated 49%)
    
por codezombie 12.01.2017 / 11:20

2 respostas

8

-exec aceita dois parâmetros: o comando para executar e um sinalizador para informar find se o comando deve ser executado uma vez por correspondência ( ; ) ou com o maior número de arquivos possível por execução ( + ).

Além disso, os parâmetros zip são incorretos.

O teste -name também não funciona dessa maneira; leva apenas um padrão por vez. Se você deseja verificar vários padrões, é necessário usar vários testes -name combinados usando -o ("ou") e envolvê-los entre parênteses (graças a xhienne para apontar isso):

find /lmms/samples/ \( -name "warp01*" -o -name "JR_effect2k*" ... \) -exec ...

(citando cada padrão para evitar problemas com globalização).

Em resumo, se você corrigir seus testes de nome e finalizar seu find com

-exec zip ~/Desktop/files.zip {} +

deve fazer a coisa certa.

    
por 12.01.2017 / 11:27
5

Você só precisa encerrar sua opção -exec com ; ou + ( man find ). Seu arquivo zip deve preceder os arquivos que você colocou no seu arquivo IIRC, então isso se tornaria:

find ... -exec zip ~/Desktop/files.zip {} ;
find ... -exec zip ~/Desktop/files.zip {} +

A versão + agrega os parâmetros no final do comando zip e chama um zip para todos os arquivos (ou vários zip se os comandos forem muito longos). É menos intensivo em E / S, mas a desvantagem é que você só pode usar {} uma vez e no final, pouco antes do + . A versão ; é mais flexível, mas chama zip para cada arquivo.

Solução alternativa sem encontrar

Você também tem um problema com o predicado -name e o @StephenKitt fornece a sintaxe correta.

Aqui está outra sintaxe que usa a capacidade de zip de entender os padrões globbing como file* . Portanto, ele não usa find , está mais próximo de sua proposta original e, provavelmente, menos propenso a erros para alguém que não está acostumado a find :

$ zip -r  ~/Desktop/files.zip /lmms/samples/ --include 'warp01*' 'JR_effect2k*' 'clean_low_key*' 'q_kick_2*' 'sticky_q_kick*' 'upright_bass*' 'pizzi*' 'chorded_perc*' 'Tr77_kick*' 'Tr77_tom1*' 'Tr77_cym*' 'hihat_008a*' 'Hat_o.ds' 'Hat_c.ds' 'Kickhard.ds' 'Tr77_snare*'

Nota: os padrões são separados por espaço. As aspas ao redor são obrigatórias, senão os padrões podem ser interpretados pelo seu shell, não por zip .

    
por 12.01.2017 / 11:28

Tags