Primeiro de tudo,
zip archive.zip 'find . -name "*pattern*.txt"'
é nunca uma boa ideia. Os nomes de arquivo podem conter espaços, caractere de novas linhas, partes que poderiam ser interpretadas como comutadores e outros itens.
Para executar uma ação para cada arquivo encontrado, você pode usar o -exec
mude ou xargs .
find . -name "*pattern*.txt" -exec zip archive.zip {} +
adicionará os arquivos um por um ao arquivo zip. Aqui, {}
simboliza o arquivo atualmente processado.
Encerrar o argumento -exec
com um +
em vez de ;
faz com que o find processe vários arquivos de uma só vez (o máximo possível sem gerar os mesmos erros que você recebe), que deve ser consideravelmente mais rápido um grande número de arquivos.
find . -name "*pattern*.txt" -print0 | xargs -0 zip archive.zip
faz essencialmente o mesmo. O xargs processa vários arquivos de uma só vez por padrão.
A opção -print0
para localizar e a -0
para os xargs fazem com que usem caracteres nulos como separadores de arquivos para lidar adequadamente com nomes de arquivos estranhos.
Não sei por que o -@
não é recomendado para o Mac OS 1 , mas find ... | zip -@
não não lidará com nomes de arquivos estranhos (especificamente, nomes de arquivos contendo caracteres de nova linha) corretamente. Isso é verdade, independentemente do sistema operacional.
1 Estou adivinhando se aplica somente ao Mac OS até a versão 9.x, já que o Mac OS usava retornos de carro como caracteres de nova linha, enquanto zip -@
esperava linefeeds.