Gostaria de criar um arquivo compactado em gz que retém o nome do arquivo original. Por exemplo, gzipping "example.txt" deve gerar um arquivo gzipped chamado "example.txt" em vez de "example.txt.gz". É possível fazer isso elegantemente com um comando (não executando um subseqüente mv
)?
14
Respostas:
Isso não funciona:
Esta é uma condição de corrida:
O problema é que o
> example.txt
(oudd of=example.txt
esse assunto) mata o arquivo antes que o outro processo tenha a chance de lê-lo. Portanto, não há uma solução óbvia, e é por isso que você deve se atermv
.Existem várias maneiras de trapacear. Você pode abrir o arquivo e desvinculá-lo - o arquivo continuará existindo até você fechá-lo - e 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 usá-lo, e mesmo se soubesse, minha resposta ainda seria:
Nem faça isso.
Se
gzip
falhar por qualquer motivo ou ocorrer algum problema, como você ficar sem espaço enquanto faz o gzip (porque outros processos estão gravando ou o resultado do gzip é maior que a entrada - o que acontece com dados aleatórios - etc.), você acabou de perder o arquivo . Parabéns!Crie um arquivo separado e
mv
com sucesso. Esse é o método mais simples, fácil de entender e mais confiável que você encontrará.fonte
gzip example.txt && mv example.txt.gz example.txt
mv
com sucesso." pode ser feito mais elegante? Eu estava apenas tentando propor que a resposta de frostschutz fosse aumentada com um exemplo específico. Semv
puder ser usado com mais elegância do que eu pensava, por favor, dê um exemplo.Eu tive o mesmo problema, como parte de uma implantação de IC no AWS S3.
Isto é o que eu fiz para compactar recursivamente um diretório (no local) sem o
.gz
sufixo:Parece limpo o suficiente para mim. Mas sim, parece que você precisa de um
mv
em algum lugar.Se você estiver usando,
grunt
você pode olhargrunt-contrib-compress
. Algumas dasgrunt
ferramentas especificamente para implantar no S3 também manipularão o gzip.fonte
find . -type ...
nãofind.
adicionar o espaço por favor :)-S
extensão que você desejaresultará em dog.txt_2015_11
quando você descompacta, deve especificar a extensão.
No unix, use o comando file para determinar que tipo de arquivo você possui, as extensões são enganosas ou estão faltando com freqüência.
fonte
Não acho que criar um arquivo gzip sem extensão seja realmente a coisa certa a se fazer.
IMHo você deve configurar seu servidor web para ler o arquivo .gz. Você provavelmente já possui uma regra como esta:
Você só precisa adicionar uma regra reescrevendo o nome do arquivo solicitado para anexar ".gz" (na verdade, você deve verificar se o arquivo existe, assim como verificar se o cliente listou o gzip no cabeçalho Accept-Encoding)
fonte
Você pode tentar o s3_website para isso.
Não gosto do fato de estar escrito em scala e ruby e que precisa de uma JVM. Também não gosto da suposição que ela faz (especialmente o fato de excluir arquivos extras do bucket), mas deve funcionar se você estiver bem com isso.
Estou planejando escrever uma ferramenta sozinha que não tenha essas limitações, fique atento.
fonte
Isso não é realmente algo que você deveria fazer, 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 deseja usar nenhum sufixo, o GNU não é bom para você, pois
gzip -S ""
retornaria agzip: invalid suffix ''
.No entanto, você sempre pode enviar algo como
gzip -S " "
(espaço em branco), e será mostrado assim:Posteriormente, se você quiser descompactá-lo, precisará fazer algo como
gunzip -c testfile\
(sem especificar o sufixo) ou mesmo com o-f
sinalizador.Sinceramente, acho que adicionar um
mv
comando com&&
não seria tão problemático para o seu código. Enfim, e como o @frostschutz disse, não é uma boa ideia fazer isso.fonte