Use o gzip para compactar os arquivos em um diretório, exceto para arquivos .gz já existentes

15

Eu tenho um diretório de logs que gostaria de configurar um trabalho para compactar usando o gzip . O problema é que não quero recomprimir os registros que já foram compactados.

Eu tentei usar ls | grep -v gz | gzip , mas parece que não funciona.

Existe uma maneira de fazer isso? Basicamente eu quero gzip todo arquivo no diretório que não termina em .gz.

    
por jabbajac 10.10.2014 / 17:35

1 resposta

23

Você pode apenas fazer:

gzip *

O gzip irá avisar que ele pula os arquivos que já possuem .gz final.
Se essa mensagem ficar no caminho, você pode usar:

gzip -q *

O que você tentou não funcionou, porque gzip não leu os nomes de arquivo dos arquivos para comprimir de stdin, para que isso funcionasse você teria que usar:

ls | grep -v gz | xargs gzip

Você excluirá arquivos com o padrão gz em qualquer lugar no nome do arquivo, não apenas no final.¹ Você também deve observar que a análise da saída de ls é perigosa quando você tem nomes de arquivos com espaços, novas linhas, etc., estão envolvidos.

Uma solução mais limpa, não contando com gzip para pular arquivos com .gz ending, que também lida com arquivos não compactados em subdiretórios:

find .  -type f ! -name "*.gz" -exec gzip {} \;


¹ Como izkata comentou: usar .gz sozinho para melhorar isso não funcionaria. Você precisaria usar grep -vF .gz ou grep -v '\.gz$' . Isso ainda deixa o perigo de processar ls 'output

    
por 10.10.2014 / 17:48

Tags