Estou tentando compactar uma pasta em unix. Isso pode ser feito usando o comando gzip?

Comentários

  • você pode usar gzip -r myfolder que fará gzip de arquivos recursivamente. Da mesma forma que você pode descompactar arquivos usando gunzip -r myfolder que descompactará os arquivos recursivamente. Para obter mais informações, man gzip
  • Use tar; ele oferece suporte a opções de compactação . gzip foi projetado como um complemento de tar, não como um substituto.
  • Observe que @ val0x00ff ‘ A sugestão quase certamente não é o que você deseja realizar.
  • @Shadur que ‘ é por isso que a postei como comment já que essa não era a resposta à sua pergunta.
  • Para demonstrar o que @Shadur significa. Arquivos dados 1 e 2 na pasta playground . gzip -r ./playground dará a você 1.gz e 2.gz (e não mais 1 e 2 arquivos) na pasta playground, NÃO um arquivo compactado com tudo dentro.

Resposta

Não.

Ao contrário de zip, gzip funciona como um algoritmo de compressão apenas .

Por várias razões, algumas das quais remontam à era das unidades de fita, o Unix usa um programa chamado tar para arquivar dados, que podem ser compactados com um programa de compressão como gzip, bzip2, 7zip, etc.

Em para “compactar” um diretório, o comando correto seria

tar -zcvf archive.tar.gz directory/ 

Isso dirá tar a

  • comprima-o usando o algoritmo z (gzip)

  • c (criar) um arquivo a partir dos arquivos em directory (tar é recursivo por padrão)

  • v (detalhadamente) lista (em / dev / stderr portanto, não afeta os comandos canalizados) todos os arquivos que adiciona ao arquivo.

  • e armazena a saída como um f (arquivo) denominado archive.tar.gz

O comando tar oferece gzip suporte (por meio da bandeira -z) exclusivamente para sua conveniência . O gzip comando / lib é completamente separado. O comando acima é efetivamente o mesmo que

tar -cv directory | gzip > archive.tar.gz 

Para descompactar e descompactar o arquivo no diretório atual, você usaria

tar -zxvf archive.tar.gz 

Esse comando é efetivamente o mesmo que

gunzip < archive.tar.gz | tar -xv 

tar tem muitos, muitas, MUITAS outras opções e usos também; Recomendo vivamente a leitura de sua página de manual em algum momento.

Comentários

  • Apenas para tornar as coisas ainda mais explícitas, isso é exatamente igual a tar -cv directory | gzip > archive.tar.gz. O arquivo resultante pode então ser extraído com tar -zxvf ou mesmo zcat file.tar.gz | tar -xv. Sendo que o tar é completamente independente do gzip, o comando tar apenas inclui suporte gzip por conveniência.
  • Tenho usado tar cvzf por um bom tempo. uma coisa a ser observada: se você usar o Windows (7-zip a ser especificado) para descompactar um arquivo *.tar.gz, leva duas rodadas. Um para descompactar *.tar.gz arquivo em um arquivo *.tar, o próximo para descompactar esse arquivo tar no conteúdo original. aumenta o tempo total de descompactação, especialmente para arquivos grandes (por exemplo, logs)
  • A nomenclatura do arquivo afeta alguma coisa na máquina? Eu sei que seria bom deixar as pessoas saberem o algoritmo originalmente usado para compactá-lo (daí .gz), mas além disso, importa como você nomeia o arquivo?
  • @hello_there_andy Não faz diferença para a maioria dos unixes, mas o Windows (e a conclusão com tabulação inteligente no Linux) fará suposições com base na extensão do nome do arquivo.
  • @vadimkotov Isso pode ser o que você ‘ re procurando por: superuser.com/questions/168749/…

Resposta

O comando gzip não compactará recursivamente um diretório em um único arquivo zip, ao usar o -r switch. Em vez disso, ele percorrerá essa estrutura de diretório e compactará cada arquivo que encontrar em um arquivo separado.

Exemplo

antes

$ tree dir1/ dir1/ |-- dir11 | |-- file11 | |-- file12 | `-- file13 |-- file1 |-- file2 `-- file3 

agora execute o gzip comando

$ gzip -r dir1 

após

$ tree dir1/ dir1/ |-- dir11 | |-- file11.gz | |-- file12.gz | `-- file13.gz |-- file1.gz |-- file2.gz `-- file3.gz 

Se você preferir compactar a estrutura de diretório, provavelmente desejará usar o comando tar e, em seguida, compactar o .tar arquivo.

$ tar zcvf dir1.tar.gz dir1/ 

Exemplo

$ tar zcvf dir1.tar.gz dir1/ dir1/ dir1/file1 dir1/file2 dir1/dir11/ dir1/dir11/file11.gz dir1/dir11/file12.gz dir1/dir11/file13.gz dir1/file3 

O que resulta no seguinte arquivo único:

$ ls -l | grep tar -rw-rw-r-- 1 saml saml 271 Oct 1 08:07 dir1.tar.gz 

Você pode confirmar seu conteúdo:

$ tar ztvf dir1.tar.gz drwxrwxr-x saml/saml 0 2013-10-01 08:05 dir1/ -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file1 -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file2 drwxrwxr-x saml/saml 0 2013-10-01 08:04 dir1/dir11/ -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file11.gz -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file12.gz -rw-rw-r-- saml/saml 27 2013-10-01 07:45 dir1/dir11/file13.gz -rw-rw-r-- saml/saml 0 2013-10-01 07:45 dir1/file3 

Resposta

A resposta à pergunta “Posso compactar uma pasta inteira usando gzip [no linux]?” é que você pode usar o programa zip no lugar do gzip, com a sintaxe:

zip -r <zip file name> <folder to zip> 

Comentários

  • @JeffSchaller: Esta é uma resposta. É um erro gravemente errado (eu acredito), mas é claramente uma resposta.
  • @ize: Eu ‘ tenho certeza de que o comando que você postou não, na verdade, use gzip.
  • Pontos por usar zip como a pergunta feita, provavelmente o autor gostaria de saber ‘ é possível FAZER O EXATO A MESMA COISA que ele costumava fazer no windows. É triste que a maioria das pessoas não ‘ não queira pensar tão longe.
  • É complicado quando a pergunta especifica … “usando gzip”.
  • Eu ‘ estou votando a favor desta resposta, pois acho que o produto (um arquivo zip) é provavelmente mais importante do que o método (usando gzip).

Resposta

Criei o script destes 2 comandos:

gzipdir:

#!/bin/bash if [[ -d $1 ]]; then cd "$1" cd .. base=$(basename "$1") tar -zcvf "$base.tgz" "$base" if [[ $? == 0 && -f "$base.tgz" ]]; then rm -rf "$base" fi else echo "Usage: $0 DIRECTORY"; fi 

ungzipdir:

#!/bin/bash if [[ -f $1 ]]; then base=${1%%.*} file=$(basename "$1"); dir=$(basename "$base"); if [[ ! -d $base ]]; then mkdir "$base" cd "$base" cd .. tar -xvf "$file" if [[ $? == 0 && -d "$dir" ]]; then rm -f "$file" fi else echo "Directory $base already exists. Nothing done." fi else echo "Usage: $0 file.tgz"; fi 

(!!!) Teste antes de usar (pois há um “rm -f” que pode remover dados importantes se usado de maneira incomum).

Como usar:

cd /home/; gzipdir MyDirectory ou gzipdir /home/MyDirectory

Irá criar /home/MyDirectory.tgz e remover MyDirectory em caso de sucesso (!!!).

ungzipdir /home/MyDirectory.tgz

Irá criar / home / MyDirectory e remover /home/MyDirectory.tgz em caso de sucesso.

Comentários

  • Para compactar TODOS os arquivos em um diretório: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (tenha cuidado com o comando find, teste-o com -exec echo {} primeiro, e certifique-se de ‘ não está capturando ‘ ./’ que compactará o diretório PARENT, possivelmente quebrando todo o diretório inicial)

Resposta

Eu recomendo usar pigz ( Implementação paralela de GZip )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz

Comentários

  • Eu também uso muito (e pixz), mas funciona quando o pipe e o redirecionamento de saída entram em ação?

Resposta

Se o seu tar do Linux não suporta a opção -z você pode usar o seguinte:

tar -cvf - dir | gzip > dir.tar.gz 

Resposta

Para ser completo, se você quero tar o arquivo no bac kground, use a resposta de @Shadur “e acrescente & no final:

tar -zcvf archive.tar.gz directory/ & 

Deixe uma resposta

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