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

gzip file.txt 

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

Comentários

  • Isso ocorre porque o gzip compacta o arquivo fornecido e cria um novo arquivo. Compactação significa espremer o arquivo original e substituí-lo por um novo. Sua opção " -c " diz explicitamente ao gzip para salvá-lo com outro nome. É por ' por que funciona
  • @SHW não ' seu comentário …?
  • @ManuelSelva uma vez que o arquivo original é compactado, ele ' não é mais necessário, acho que esse era o design.
  • Por que gzip / gunzip fazer isso por padrão quando nenhuma outra ferramenta Unix faz isso está além de mim.

Resposta

Para GNU gzip 1.6 ou superior, FreeBSD e derivados ou versões recentes do NetBSD, consulte resposta de don_cristi “s .

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

gzip < file > file.gz 

Quando não fornecido qualquer argumento, gzip lê sua entrada padrão, compacta 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 os arquivos chamado "--help" ou "-" (este último ainda sendo um problema para gzip -c --).

Outro benefício em relação a gzip -c file > file.gz é que se file não pode “ser aberto, o comando falhará sem criar um file.gz vazio (ou sobrescrever um file.gz existente) e sem executar gzip em tudo.

Uma diferença significativa em comparação com gzip -k é que não haverá tentativa de copiando os metadados do file “s (propriedade, permissões, hora de modificação, nome do arquivo descompactado) para file.gz.

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

Comentários

  • Agora, isso aborda as especificidades do OP ' s pergunta e responde à ge questão geral " Como dizer ao gzip para manter o arquivo original ". Muito prático e mais útil do que -c.
  • Observe que < e > devem ser digitados no comando e não representam um espaço reservado para o nome do arquivo
  • O que ' s ? Não foi possível ' encontrá-lo nas páginas de manual, por exemplo esta versão aqui linux.die.net/man/1/gzip . Além disso, parece que o gzip copia os metadados do arquivo ' s por padrão.
  • @ flow2k, que ' s o link para a resposta don_cristi ' s.
  • @St é phaneChazelas Trabalhando no gzip versão 1.4 também. cat file | gzip > file.gz

Resposta

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

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 -k ou --keep para manter o arquivo original:

gzip -k -- "$file" 

(observe que não funciona se $file for - (que gzip interpreta como significando stdin em vez do arquivo real chamado -), nesse caso, você deve alterá-lo para ./-)

Essa opção era introduzido pela primeira vez na implementação do FreeBSD de gzip (no FreeBSD 7.0 em 2007) para consistência com bzip2. Isso gzip é baseado na reescrita do GNU gzip pelo NetBSD. O eventualmente voltou para o NetBSD em 2010 .

Comentários

  • Nossa. RHEL6 só vem com zip 1.3.12 na base …
  • Isso funciona no Mac / OS X 🙂 (que é BSD)
  • Existem muitas distros padrão que não usam > = 1.6 mais? Querendo saber se a resposta precisa de atualização
  • Para que serve " – "? Acho que gzip -k " arquivo " funciona bem.
  • @notilas see unix.stackexchange.com/q/11376/22142

Resposta

Pela 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 

Comentários

  • Observe que se o arquivo for -, você deve chamá-lo de gzipkeep ./-.
  • Esta é a melhor solução para scripts IMO, pois você pode ter certeza de que o arquivo de saída > "$1.gz" existirá exatamente como especificado. Além disso, você também pode especificar um nome diferente se for necessário.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *