Como dizer ao gzip para manter o arquivo original?

210

Gostaria de compactar um arquivo de texto usando a ferramenta de linha de comando gzip, mantendo o arquivo original. Por padrão, executando o seguinte comando

gzip file.txt

resulta na modificação e renomeação desse arquivo file.txt.gz. em vez desse comportamento, eu gostaria de ter esse novo arquivo compactado além do existente file.txt. Por enquanto, estou usando o seguinte comando para fazer isso

gzip -c file.txt > file.txt.gz

Funciona, mas estou me perguntando por que não há uma solução mais fácil para executar uma tarefa tão comum? Talvez eu tenha perdido a opção de fazer isso?

Manuel Selva
fonte
3
Isso ocorre porque o gzip compacta o arquivo fornecido e cria um novo arquivo. Compressão significa espremer o arquivo original e substituí-lo por um novo. Sua opção "-c" está dizendo explicitamente ao gzip para salvá-lo com outro nome. É por isso que funciona #
SHW
@ SHW Não recebi seu comentário ...?
Manuel Selva
@ManuelSelva depois que o arquivo original é compactado, ele não é mais necessário, acho que esse foi o design.
daisy
2
Por que o gzip / gunzip faz isso por padrão, quando nenhuma outra ferramenta unix faz isso, está além de mim.
Mateen Ulhaq 29/11

Respostas:

247

Para o GNU gzip1.6 ou superior, FreeBSD e derivados ou versões recentes do NetBSD, consulte a resposta de don_cristi .

Com qualquer versão, você pode usar os redirecionamentos de shell como em:

gzip < file > file.gz

Quando não recebe nenhum argumento, gziplê sua entrada padrão, compacta-a ​​e grava a versão compactada em sua saída padrão. Como um bônus, ao usar redirecionamentos de shell, você não precisa se preocupar com arquivos chamados "--help"ou "-"(esse último ainda está sendo um problema gzip -c --).

Outro benefício gzip -c file > file.gzé que, se filenão puder ser aberto, o comando falhará sem criar um vazio file.gz(ou substituir um existente file.gz) e sem executar gzip.

Uma diferença significativa em relação ao fato gzip -ké que não haverá tentativa de copiar os filemetadados (propriedade, permissões, hora da modificação, nome do arquivo descompactado) para file.gz.

Além disso, se file.gzjá existir, o substituirá silenciosamente, a menos que você tenha ativado a noclobberopção no seu shell ( set -o noclobberpor exemplo, em shells POSIX).

Stéphane Chazelas
fonte
4
Agora, isso aborda as especificidades da pergunta do OP e responde à pergunta geral "Como dizer ao gzip para manter o arquivo original". Muito útil e mais útil que -c.
Codewaggle
8
Note que o <e> são realmente suposto ser digitado no comando e não está representando um espaço reservado para o nome do arquivo
Gaurav Gupta
Qual a -kopção? Não foi possível encontrá-lo nas páginas de manual, por exemplo, nesta versão aqui linux.die.net/man/1/gzip . Além disso, parece que o gzip copia os metadados do arquivo por padrão.
flow2k
1
@ flow2k, esse é o link para a resposta de don_cristi.
Stéphane Chazelas
ah, eu vejo isso nos meus macos, mas pena que não está no RHEL nem no Ubuntu. Obrigado.
flow2k
138

Observe que o lançamento recente (junho de 2013) "aceita a opção --keep (-k), para consistência com ferramentas como xz, lzip e bzip2. Com essa opção, o gzip não remove mais os arquivos de entrada nomeados ao compactar ou descompactar" .gzip-1.6

Trecho da página de manual:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

Portanto, a partir de 1.6, você pode usar -kou --keepmanter o arquivo original:

gzip -k -- "$file"

(observe que ele não funciona se $fileis -(que gzipinterpreta como stdin em vez do arquivo real chamado -); nesse caso, você deve alterá-lo para ./-)

Essa opção foi introduzida pela primeira vez na implementação dogzip FreeBSD (no FreeBSD 7.0 em 2007) para fins de consistência bzip2. Isso gzipé baseado na reescrita do GNU gzippelo NetBSD. A -kopção acabou retornando ao NetBSD em 2010 .

don_crissti
fonte
10
Nossa. RHEL6 só vem com zip 1.3.12 da base ...
Nicholas Tolley Cottrell
Isso funciona em Mac / OS X :) (que é BSD)
paul
Existem muitas distribuições padrão que não usam mais> = 1.6? Perguntando se a resposta precisa de atualização
MichaelChirico 28/11
Para que é? Acho gzip -k "arquivo" funciona bem.
Notep
3
@notilas see unix.stackexchange.com/q/11376/22142
don_crissti
30

A partir da documentação, parece que não há opção para criar uma cópia do arquivo.

Você pode definir uma função shell

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

e depois

gzipkeep file.txt
Matteo
fonte
2
Observe que, se o arquivo for -, você deve chamá-lo como gzipkeep ./-.
Stéphane Chazelas