GZIP não descompacta como um diretório

1

Estou tentando compactar uma pasta para poder fazer o FTP para o meu servidor da Web.

Estou compactando o osx snow leopard e descompactando no ubuntu 8.04

Estes são os dois comandos que estou executando

sudo git archive master | gzip > v-1.25.gz

sudo gunzip v1.25.gz 

Quando eu descomprimido na minha máquina local ele funciona bem, mas no servidor a saída é um arquivo e não um diretório

O que estou fazendo de errado?

    
por Cato Johnston 13.10.2009 / 09:40

2 respostas

4

Se você vem de um mundo Windows, está acostumado a usar ferramentas como zip ou rar, que compactam coleções de arquivos. Na tradição típica do Unix de fazer uma coisa e fazer uma coisa bem, você tende a ter duas utilidades diferentes; uma ferramenta de compactação e um formato de arquivo. As pessoas usam essas duas ferramentas juntas para fornecer a mesma funcionalidade que o zip ou o rar fornecem.

Existem vários formatos de compressão diferentes; os comuns usados no Linux atualmente são o gzip (às vezes conhecido como zlib) e o mais novo, com melhor desempenho, o bzip2. Infelizmente o bzip2 usa mais CPU e memória para fornecer as maiores taxas de compressão. Você pode usar essas ferramentas para compactar qualquer arquivo e por arquivos de convenção compactados por um desses formatos é .gz e .bz2. Você pode usar gzip e bzip2 para compactar e gunzip e bunzip2 para descomprimir esses formatos.

Existem também vários tipos diferentes de formatos de arquivo disponíveis, incluindo cpio, ar e tar, mas as pessoas tendem a usar somente o tar. Eles permitem que você pegue vários arquivos e os armazene em um único arquivo. Eles também podem incluir informações de caminho e permissão. Você pode criar e descompactar um arquivo tar usando o comando tar. Você pode ouvir essas operações chamadas "tarring" e "untarring". (O nome do comando vem de um encurtamento do Tape ARchive. O tar era uma melhoria no formato ar em que você poderia usá-lo para abranger várias fitas físicas para backups).

  # tar -cf archive.tar list of files to include

Isto irá criar (-c) e arquivar em um arquivo -f chamado archive.tar. (.tar é a extensão da convenção para arquivos tar). Agora você deve ter um único arquivo que contém cinco arquivos ("list", "of", "files", "to" e "include"). Se você der ao tar um diretório, ele irá recursar para esse diretório e armazenar tudo dentro dele.

  # tar -xf archive.tar
  # tar -xf archive.tar list of files

Isto irá extrair (-x) o archive.tar criado anteriormente. Você pode extrair apenas os arquivos que deseja do arquivo, listando-os no final da linha de comando. Em nosso exemplo, a segunda linha extrairia "list", "of", "file", mas não "to" e "include". Você também pode usar

  # tar -tf archive.tar

para obter uma lista do conteúdo antes de extraí-lo.

Agora, você pode combinar essas duas ferramentas para replicar a funcionalidade do zip:

  # tar -cf archive.tar directory
  # gzip archive.tar

Agora você terá um arquivo archive.tar.gz. Você pode extraí-lo usando:

  # gunzip archive.tar.gz
  # tar -xf archive.tar

Podemos usar pipes para nos salvar com um arquivo intermediário.tar:

  # tar -cf - directory | gzip > archive.tar.gz
  # gunzip < archive.tar.gz | tar -xf -

Você pode usar - com a opção -f para especificar stdin ou stdout (tar sabe qual baseado no contexto).

Podemos fazer um pouco melhor, porque, em uma leve quebra aparente da idéia de "um trabalho bem", o tar tem a capacidade de comprimir sua saída e descompactar sua entrada usando o argumento -z (eu digo aparente, porque ainda usa a linha de comando gzip e gunzip nos bastidores)

 # tar -czf archive.tar.gz directory
 # tar -xzf archive.tar.gz

Para usar o bzip2 ao invés do gzip, use bzip2, bunzip2 e -j ao invés de gzip, gunzip e -z respectivamente (tar -cjf archive.tar.bz2). Algumas versões do tar podem detectar um arquivo de arquivos bzip2 com o uso de -z e fazer a coisa certa, mas provavelmente vale a pena adquirir o hábito de ser explícito.

Voltando ao seu problema específico. git archive pode criar um arquivo tar ou zip. Por padrão, ele cria um arquivo tar.

 # git archive master | gzip > v-1.25.tar.gz

Isso criaria um arquivo tar compactado. Como vimos acima, podemos extrair isso usando:

 # tar -xzf v-1.25.tar.gz

Você também pode usar:

 # git archive --format=zip master > v-1.25.zip
 # unzip v-1.25.zip

Mais informações:

por 13.10.2009 / 11:45
4

g(un)zip geralmente não suporta diretamente o arquivamento - apenas a compactação de um único arquivo. É mais comum usar o tar archiver e gzip o arquivo tar. Eu estou supondo que o gzip variante que você está usando para comprimir os dados está percebendo que a entrada é um diretório e adicionando o passo extra automaticamente (e fazendo o mesmo ao descomprimir).

Experimente tar -xvzf v1.25.gz ou gunzip v1.25.gz | tar -xv
(remova o v das opções tar se você não quiser uma saída detalhada, que lista os arquivos à medida que são extraídos)
Ou se você já tiver o arquivo descompactado, você também pode tentar tar -xvf v1.25 como o arquivo deveria, se eu estou acertando, ser um arquivo tar .

    
por 13.10.2009 / 10:37