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 gzip
nã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 gz
em 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 gzip
de pular arquivos com uma .gz
finalização, é que também lida com arquivos não compactados em subdiretórios:
find . -type f ! -name "*.gz" -exec gzip {} \;
¹ Como izkata
comentado: 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
a saída
$
para ficar mais claro. E você não escapar do.
mesmo, então ele só vai para excluir arquivos que começam comgz
(uma vez que eles não têm "qualquer caractere antesgz
")$
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".gz
qualquer 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.