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

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

Eu tenho um diretório de logs que gostaria de configurar um trabalho para compactar usandogzip. O problema é que não quero recompactar os logs que já compactei.

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

Existe uma maneira de fazer isso? Basicamente, quero compactar todos os arquivos do diretório que não terminam em .gz.

Responder1

Você pode simplesmente fazer:

gzip *

O gzip informará que ignora os arquivos que já possuem um .gz final.
Se essa mensagem atrapalhar, você pode usar:

gzip -q *

O que você tentou não funcionou, pois gzipnão lê os nomes dos arquivos para compactar do stdin, para que isso funcionasse você teria que usar:

ls | grep -v gz | xargs gzip

Você excluirá arquivos com o padrão gzem qualquer lugar do nome do arquivo, não apenas no final.¹ Você também deve observar que analisar a saída de lsé perigoso quando há nomes de arquivos com espaços, novas linhas, etc., envolvidos.

Uma solução mais limpa, sem depender de gzippular arquivos com .gzfinal, é que também lida com arquivos não compactados em subdiretórios:

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



¹ Conforme izkatacomentado: usar .gzsozinho para melhorar isso, não funcionaria. Você precisaria usar grep -vF .gzou grep -v '\.gz$'. Isso ainda deixa o perigo de processar lsa saída

informação relacionada