Estou tentando compactar uma pasta em unix. Isso pode ser feito usando o comando gzip?
Comentários
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 comtar -zxvf
ou mesmozcat file.tar.gz | tar -xv
. Sendo que o tar é completamente independente do gzip, o comandotar
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/ &
gzip -r myfolder
que fará gzip de arquivos recursivamente. Da mesma forma que você pode descompactar arquivos usandogunzip -r myfolder
que descompactará os arquivos recursivamente. Para obter mais informações,man gzip
tar
; ele oferece suporte a opções de compactação .gzip
foi projetado como um complemento detar
, não como um substituto.comment
já que essa não era a resposta à sua pergunta.1
e2
na pastaplayground
.gzip -r ./playground
dará a você1.gz
e2.gz
(e não mais1
e2
arquivos) na pastaplayground
, NÃO um arquivo compactado com tudo dentro.