Como dizer ao gzip para manter o arquivo original?

179

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

gzip file.txt

resulta em modificar este arquivo e renomeá-lo como file.txt.gz . em vez desse comportamento, gostaria de ter esse novo arquivo compactado em addition como o 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á solução mais fácil para executar uma tarefa tão comum? Talvez eu tenha perdido a opção de fazer isso?

    
por Manuel Selva 31.08.2012 / 10:47

3 respostas

222

Para o GNU gzip 1.6 ou superior, FreeBSD e derivados ou versões recentes do NetBSD, veja a resposta do don_cristi .

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

gzip < file > file.gz

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

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

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

Além disso, se o file.gz já existir, ele irá silenciosamente sobrescrevê-lo, a menos que você tenha ativado a opção noclobber no seu shell (com set -o noclobber , por exemplo, em shells POSIX).

    
por 18.12.2012 / 22:12
121

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

Trecho da página do manual:

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

Portanto, a partir de 1.6 , você pode usar -k ou --keep para manter o arquivo original:

gzip -k -- "$file"

(note que não funciona se $file é - (que gzip interpreta como significando stdin em vez do arquivo real chamado - ), nesse caso, você tem que mudar para ./- )

Essa opção foi introduzida pela primeira vez na implementação do FreeBSD de gzip (no FreeBSD 7.0 em 2007) para consistência com bzip2 . Esse gzip é baseado em uma reescrita do GNU gzip pelo NetBSD. O -k option eventualmente retornou ao NetBSD em 2010 .

    
por 14.06.2013 / 16:54
29

Da documentação parece que não há opção para criar uma cópia do arquivo.

Você pode definir uma função de shell

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

e depois

gzipkeep file.txt
    
por 31.08.2012 / 10:54