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

19

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 logs que já compactados.

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 no diretório que não terminam em .gz.

jabbajac
fonte

Respostas:

26

Você pode apenas fazer:

gzip *

O gzip lhe dirá que pula os arquivos que já têm um .gz final.
Se essa mensagem atrapalhar, você pode usar:

gzip -q *

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

ls | grep -v gz | xargs gzip

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

Uma solução mais limpa, sem depender gzipde pular arquivos com uma .gzfinalização, é que também lida com arquivos não compactados em subdiretórios:

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



¹ Como 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

Anthon
fonte
11
"... isso torna menos provável a correspondência com alguma parte interna de um nome de arquivo" - é grep, use apenas $para ficar mais claro. E você não escapar do .mesmo, então ele só vai para excluir arquivos que começam com gz(uma vez que eles não têm "qualquer caractere antes gz")
Izkata
11
@ Izkata: Não, incluindo o ponto sem escape e não ancorando o regex, $vai excluir ( -v) todos os arquivos que possuem nomes que consistem em três ou mais caracteres, incluindo qualquer caractere seguido de "gz" em qualquer lugar do nome do arquivo. Por isso, incluirá arquivos com nomes que começam com "gz".
Pausado até novo aviso.
11
@DennisWilliamson Meu último comentário não foi claro, ele também excluirá arquivos com gzqualquer lugar no nome (exceto o início). Portanto, é melhor ancorá-lo de qualquer maneira. Não tendo usado $, parecia que você não sabia o que .significa em uma expressão regular, daí o restante do comentário confuso.
Izkata