Posso compactar uma pasta inteira usando o gzip?

407

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

user1269502
fonte
6
você pode usar o gzip -r myfolderque irá compactar os arquivos recursivamente. Da mesma maneira que você pode descompactar arquivos usando o gunzip -r myfolder que descompactará os arquivos recursivamente. Para mais informações, man gzip
Valentin Bajrami
12
Use tar; suporta opções de compactação. gzipfoi projetado como um complemento tare não como um substituto.
devnull
13
Observe que a sugestão de @ val0x00ff quase certamente não é o que você deseja realizar.
Shadur
4
@ Shahadur, é por isso que eu publiquei, commentpois essa não era a resposta para sua pergunta.
Valentin Bajrami
2
Demonstrar o que significa @Shadur. Arquivos fornecidos 1e 2na pasta playground. gzip -r ./playgrounddará a você 1.gze 2.gz(e não mais 1e 2arquivos) na pasta playground, NÃO um arquivo compactado com tudo.
Jeff Xiao

Respostas:

660

Não.

Ao contrário zip, gzipfunciona como um algoritmo de compressão única .

Devido a várias razões, algumas das quais remontam à época de unidades de fita, Unix usa um programa chamado tarpara arquivar dados, que pode ser compactado com um programa de compressão como gzip, bzip2, 7zip, etc.

Para "compactar" um diretório, o comando correto seria

tar -zcvf archive.tar.gz directory/ 

Isso dirá tarpara

  • compactá-lo usando o algoritmo z (gzip)

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

  • v (verbalmente) listar (em / dev / stderr para que não afete os comandos canalizados) todos os arquivos adicionados ao arquivo morto.

  • e armazene a saída como um f (arquivo) chamadoarchive.tar.gz

O tarcomando oferece gzipsuporte (por meio da -zbandeira) exclusivamente para sua conveniência. O gzipcomando / lib é completamente separado. O comando acima é efetivamente o mesmo que

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

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

tar -zxvf archive.tar.gz

Esse comando é efetivamente o mesmo que

gunzip < archive.tar.gz | tar -xv

tartem muitas, muitas MUITAS outras opções e usos também; Eu recomendo vivamente ler sua página de manual em algum momento.

Shadur
fonte
51
Apenas para tornar as coisas ainda mais explícitas, isso é exatamente equivalente a tar -cv directory | gzip > archive.tar.gz. O arquivo resultante pode ser extraído com tar -zxvfou mesmo zcat file.tar.gz | tar -xv. Aponte que o tar é completamente independente do gzip, o tarcomando inclui apenas o suporte ao gzip por conveniência.
Patrick
Eu tenho usado tar cvzfpor um bom tempo. uma coisa a observar: se você usar o Windows ( 7-zipa ser especificado) para descompactar um *.tar.gzarquivo, são necessárias duas rodadas. Um para descompactar o *.tar.gzarquivo em um *.tararquivo, 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)
Jeff Xiao
1
A nomeação do arquivo afeta algo em termos de máquina? Eu sei que seria bom informar às pessoas o algoritmo originalmente usado para compactá-lo (daí o .gz), mas, fora isso, é realmente importante como você nomeia o arquivo?
9136 hello_there_andy
3
@hello_there_andy Não faz diferença para a maioria dos unixes, mas o Windows (e a conclusão de guias inteligentes no linux) fará suposições com base na extensão do nome do arquivo.
Shadur
1
@vadimkotov Isso pode ser o que você está procurando: superuser.com/questions/168749/…
Shadur
47

O gzipcomando não comprime recursivamente um diretório em um único arquivo zip, ao usar a -ropção. Em vez disso, ele percorrerá a estrutura de diretórios e compactará cada arquivo encontrado em um arquivo separado.

Exemplo

antes

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

agora execute o gzipcomando

$ gzip -r dir1

depois de

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

Se você preferir compactar a estrutura de diretórios, provavelmente desejará usar o tarcomando e compactar o .tararquivo resultante .

$ 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
slm
fonte
4

Eu escrevi estes 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 do uso (pois existe um 'rm -f' que pode remover dados importantes se usados ​​de maneira incomum).

Como usar:

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

Criará /home/MyDirectory.tgz e removerá o MyDirectory com êxito (!!!).

ungzipdir /home/MyDirectory.tgz

Criará / home / MyDirectory e removerá /home/MyDirectory.tgz com êxito.

lepe
fonte
Para compactar TODOS os arquivos em um diretório: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (tenha cuidado com o comando find, teste-o -exec echo {}primeiro e verifique se você não está capturando './', que compactará o diretório PARENT, possivelmente quebrando todo o diretório pessoal)
andrew lorien
1

Eu recomendo usar pigz( Implementação Paralela do GZip )

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

nyxee
fonte
Também uso muito (e pixz), mas funciona quando os pipes e o redirecionamento de saída entram em ação?
Michael Wolf
1

A resposta à pergunta "Posso compactar uma pasta inteira usando o zip no linux?" É usar a sintaxe:

zip -r <zip file name> <folder to zip>
ize
fonte
Se você tiver uma nova pergunta, faça-o clicando no botão Fazer pergunta . Inclua um link para esta pergunta se ela ajudar a fornecer contexto. - Da avaliação
Jeff Schaller
2
@ JeffSchaller: Esta é uma resposta. É uma coisa extremamente errada (acredito), mas é claramente uma resposta.
Scott
1
@ize: Eu tenho certeza que o comando que você postou não usa o gzip.
dhag
1
Pontos por usar o zip como a pergunta feita, provavelmente o autor gostaria de saber que é possível fazer a mesma coisa que costumava fazer no Windows. É triste que a maioria das pessoas não queira pensar tão longe.
Florian Heigl
2
É complicado quando a pergunta especifica ... "using gzip".
Jeff Schaller
1

Para garantir a integridade, se você quiser tar o arquivo em segundo plano, use a resposta de @ Shadur e adicione &no final:

tar -zcvf archive.tar.gz directory/ &
shiramy
fonte
0

Se o seu tar linux não suporta a -zopção, você pode usar o seguinte:

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