Como criar um arquivo gzip sem extensão de arquivo .gz?

13

Eu gostaria de criar um arquivo gzipado que retenha o nome do arquivo original. Por exemplo, gzipping "example.txt" deve gerar um arquivo gzipado chamado "example.txt" em vez de "example.txt.gz". É possível fazer isso elegantemente com um comando (não fazendo um mv subsequente)?

    
por jamieb 21.03.2013 / 19:39

6 respostas

12

Isso NÃO funciona:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

Esta é uma condição de corrida:

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

O problema é que > example.txt (ou dd of=example.txt ) mata o arquivo antes que o outro processo tenha a chance de lê-lo. Portanto, não há solução óbvia, e é por isso que você deve ficar com mv .

Existem várias maneiras de enganar você. Você pode abrir o arquivo, depois desvinculá-lo - o arquivo continuará existindo até você fechá-lo - e então criar um novo arquivo com o mesmo nome e gravar os dados compactados nele. No entanto, eu não conheço uma maneira óbvia de coagir o bash a usar isso, e mesmo se o fizesse, minha resposta ainda seria:

Nem faça isso.

Se gzip falhar por algum motivo, ou ocorrer algum problema, como você ficar sem espaço enquanto gzipping (porque outros processos estão gravando ou o resultado gzip é maior que a entrada - que acontece para dados aleatórios - etc.) , você acabou de perder seu arquivo. Parabéns!

Crie um arquivo separado e mv no sucesso. Esse é o método mais simples, fácil de entender e mais confiável que você encontrará.

    
por 21.03.2013 / 20:00
8

Eu tive o mesmo problema, como parte de uma implantação de IC no AWS S3.

Foi o que fiz para recursivamente gzipar um diretório (no lugar) sem o sufixo .gz :

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

Parece limpo o suficiente para mim. Mas parece que você precisa de um mv em algum lugar.

Se você estiver usando grunt , poderá ver grunt-contrib-compress . Algumas das ferramentas grunt especificamente para implantação no S3 também tratarão do gzip para você.

    
por 11.12.2014 / 21:10
1

Eu não acho que criar um arquivo gzip sem extensão seja realmente a coisa apropriada a fazer.

IMHo você deve configurar seu servidor web para ler o arquivo .gz. Você provavelmente já tem uma regra assim:

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

Você só precisa adicionar uma regra reescrevendo o nome do arquivo solicitado para acrescentar ".gz" (na verdade, você deve verificar se o arquivo existe, assim como você deve verificar se o cliente listou gzip no cabeçalho Accept-Encoding)

    
por 03.06.2014 / 12:02
1

Você pode tentar o s3_website para isso.

Eu não gosto do fato de estar escrito tanto em scala quanto em ruby e que ele precisa de uma JVM. Também não gosto da suposição que faz (especialmente o fato de que ele exclui arquivos extras do bucket), mas deve funcionar se você estiver bem com isso.

Estou planejando escrever uma ferramenta dessas que não tem essas limitações, fique ligado.

    
por 28.07.2014 / 10:43
1

-S extensão que você deseja

gzip -S "'_date +%Y_%M' dog.txt 

resultará em dog.txt_2015_11

quando você descompacta você deve especificar a extensão.

gzip -d _2015_11 dog.txt_2015_11

No unix, use o comando file para determinar o tipo de arquivo que você possui, as extensões enganosas ou ausentes com frequência.

    
por 18.11.2015 / 16:13
0

Isso não é realmente algo que você deveria estar fazendo, principalmente porque ao transferir esse arquivo para outros sistemas ou pessoas, pode acabar sendo confuso para eles e não encontrá-lo como um arquivo compactado.

Se você não quiser usar nenhum sufixo, o GNU não é bom para você, pois gzip -S "" retornaria um gzip: invalid suffix '' .

No entanto, você sempre pode enviar algo como gzip -S " " (espaço em branco) e será mostrado assim:

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

Depois, se você quiser descompactá-lo, terá que fazer algo como gunzip -c testfile\ (sem especificar o sufixo) ou mesmo com -f flag.

Eu sinceramente acho que adicionar um comando mv com && não causaria tanto incômodo ao seu código. De qualquer forma, e como @frostschutz disse, não é uma boa ideia fazer isso.

    
por 03.06.2014 / 10:07

Tags