O Gzip deve honrar o nome do arquivo original durante a descompactação?

4

Esta pergunta vem de uma questão de biblioteca do Crypto ++ no Stack Overflow: Como adicionar um nome de arquivo ao arquivo se estiver compactando usando a classe Gzip? .

O Gzip, conforme especificado em RFC 1952 , possui um campo opcional para o nome do arquivo original:

  (if FLG.FNAME set)

     +=========================================+
     |...original file name, zero-terminated...| (more-->)
     +=========================================+

Se o FNAME bit estiver definido no campo de flag, o nome do arquivo original estará presente.

Adicionamos o recurso ao Crypto ++ e o testamos no OS X. No OS X, parece que o programa gzip , o Unarchiver (o programa de arquivamento padrão), e o Arquivar Browser (compra na App Store) não respeita o nome do arquivo original. Ou seja, cada um se descompacta para um nome de arquivo, que é o nome do arquivo sem a extensão gz ; e não o nome do arquivo original como aparece no cabeçalho.

Por exemplo, aqui está uma imagem abaixo do 'Navegador de arquivos' . O campo do nome do arquivo original é definido como test-filename.txt , mas a ferramenta mostra o nome do arquivo como gzip-test e o descompacta para um arquivo chamado gzip-test :

GZip(eGunzip)nãoépadrão Comando Unix do IEEE , então não consigo descobrir onde buscar conhecimento sobre o comportamento esperado.

Esse comportamento é esperado? Ou estou vendo um bug em três programas diferentes?

Se é esperado, então que propósito prático o nome original serve?

    
por jww 02.01.2015 / 22:57

2 respostas

4

De acordo com a página de manual do gzip , usando a opção -N ou --name ao usar gunzip recupera o nome do arquivo original. -N é o padrão ao compactar (portanto, gzip sempre salva o nome do arquivo original), mas não ao descompactar, portanto, ele deve ser usado explicitamente com gunzip .

Eu testei isso da seguinte forma:

$ ls
test.txt

$ gzip test.txt
$ ls
test.txt.gz

$ mv test.txt.gz widget.gz

$ gunzip -N widget.gz
$ ls
test.txt

... qual é o resultado que estávamos procurando.

    
por 03.01.2015 / 01:37
3

gzip / gunzip (versão 1.6 no Linux Mint / Ubuntu) não aparece para lembrar ou usar os nomes de arquivos originais, mas aparentemente pode . Minha resposta original, depois de alguns testes básicos, foi que ele não salvou os nomes dos arquivos, mas eu fui enganado pela saída equivocada de --list (provavelmente como o OP também estava).

A página man indica que pode salvar & use o nome do arquivo original, mas mesmo ao criar um arquivo .gz com a opção -N or --name , ao listar ( -l ) o conteúdo desse arquivo .gz, a coluna uncompressed_name listará o nome de arquivo atual "base".

$ echo test > t1
$ gzip -vkN t1
t1: -40.0% -- replaced with t1.gz

$ gzip -vl t1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1

$ cp t1.gz N1.gz
$ gzip -vl N1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 15:04                  28                   5 -40.0% N1

A menos que você também use a opção -N ao testar / listar, então mostra o nome do arquivo original

$ gzip -vlN t1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1
$ gzip -vlN N1.gz 
method  crc     date  time           compressed        uncompressed  ratio uncompressed_name
defla 3bb935c6 Jan  3 14:59                  28                   5 -40.0% t1

Descompactar sem usar a opção -N não restaura o nome do arquivo original,

Eu não acho que o gzip tenha salvado ou usado o nome do arquivo original, é mais uma compactação "um arquivo por vez" usada para arquivos .tar, com o tar salvando vários arquivos e seus nomes, a utilidade do gzip nomes parece limitado.

Outros formatos de arquivo compactado, como .zip, .7z, também lembram nomes de arquivos, já que eles arquivam & comprimir vários arquivos, eles são como um .tar.gz em um.

Falando de criptografia, o gpg pode lembrar & usar nomes de arquivos originais (definitivamente quando usa a criptografia -c simétrica em um único arquivo, deve funcionar também para criptografia de chave pública).

    
por 02.01.2015 / 23:28