Posso zipar uma pasta inteira usando o gzip?

354

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

    
por user1269502 01.10.2013 / 10:22

6 respostas

571

Não.

Ao contrário de zip , gzip funciona como um algoritmo de compactação somente .

Por vários motivos, alguns dos quais remetem à era das unidades de fita, o Unix usa um programa chamado tar para arquivar dados, que podem ser compactados com um programa de compactação como gzip , bzip2 , 7zip , etc.

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

tar -zcvf archive.tar.gz directory/ 

Isso dirá tar a

  • compacte-o usando o algoritmo z (gzip)

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

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

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

O comando tar oferece gzip support (via -z flag) apenas para sua conveniência. O comando gzip / 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 muitas, muitas, MUITAS outras opções e usos também; Eu sinceramente recomendo ler através de sua manpage em algum momento.

    
por 01.10.2013 / 13:55
44

O comando gzip não comprimirá recursivamente um diretório em um único arquivo zip, ao usar a opção -r . Em vez disso, ele percorrerá essa estrutura de diretórios 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 comando gzip

$ gzip -r dir1

depois

$ 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 comando tar e compactar o arquivo .tar 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

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
    
por 01.10.2013 / 14:09
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

(!!!) Por favor, teste antes de usar (já que existe um 'rm -f' que potencialmente poderia 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 com sucesso (!!!).

ungzipdir /home/MyDirectory.tgz

Criará / home / MyDirectory e removerá /home/MyDirectory.tgz o sucesso.

    
por 05.07.2016 / 07:19
1

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

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

    
por 16.08.2017 / 18:39
0

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

tar -cvf - dir | gzip > dir.tar.gz
    
por 28.12.2016 / 16:53
-1

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

zip -r <zip file name> <folder to zip>
    
por 12.10.2017 / 20:02

Tags