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 degzipkeep ./-
. - 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.