web-dev-qa-db-fra.com

Puis-je compresser un dossier entier à l'aide de gzip?

J'essaie de compresser un dossier sous Unix. Cela peut-il être fait en utilisant la commande gzip?

433
user1269502

Non.

Contrairement à Zip, gzip fonctionne uniquement comme un algorithme de compression .

Pour diverses raisons, dont certaines rappellent l'époque des lecteurs de bande, Unix utilise un programme nommé tar pour archiver les données, qui peuvent ensuite être compressées avec un programme de compression comme gzip, bzip2, 7Zip, etc.

Afin de "Zip" un répertoire, la commande correcte serait

tar -zcvf archive.tar.gz directory/ 

Cela indiquera à tar

  • le compresser en utilisant l'algorithme z (gzip)

  • c (créer) une archive à partir des fichiers dans directory (tar est récursif par défaut)

  • v (verbeusement) liste (sur/dev/stderr donc cela n'affecte pas les commandes canalisées) tous les fichiers qu'il ajoute à l'archive.

  • et stocker la sortie sous la forme d'un f (fichier) nommé archive.tar.gz

La commande tar offre la prise en charge de gzip (via la commande -z flag) uniquement pour votre commodité. La commande gzip/lib est complètement distincte. La commande ci-dessus est effectivement la même que

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

Pour décompresser et décompresser l'archive dans le répertoire courant que vous utiliseriez

tar -zxvf archive.tar.gz

Cette commande est effectivement la même que

gunzip < archive.tar.gz | tar -xv

tar a aussi beaucoup, beaucoup, BEAUCOUP d'autres options et utilisations; Je recommande vivement de lire sa page de manuel un jour.

696
Shadur

La commande gzip ne compressera pas récursivement un répertoire en un seul fichier Zip, lorsque vous utilisez le commutateur -r. Au lieu de cela, il parcourra cette structure de répertoires et compressera chaque fichier qu'il trouvera dans un fichier distinct.

Exemple

avant

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

exécutez maintenant la commande gzip

$ gzip -r dir1

après

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

Si vous préférez compresser la structure du répertoire, vous voudrez probablement utiliser la commande tar, puis compresser le fichier .tar Résultant.

$ tar zcvf dir1.tar.gz dir1/

Exemple

$ 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

Ce qui donne le fichier unique suivant:

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

Vous pouvez confirmer son contenu:

$ 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
49
slm

J'ai écrit ces 2 commandes:

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

(!!!) Veuillez tester avant utilisation (car il y a un 'rm -f' qui pourrait potentiellement supprimer des données importantes s'il est utilisé d'une manière peu commune).

Comment utiliser:

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

Créera /home/MyDirectory.tgz et supprimera MyDirectory en cas de succès (!!!).

ungzipdir /home/MyDirectory.tgz

Créera/home/MyDirectory et supprimera /home/MyDirectory.tgz en cas de succès.

5
lepe

Pour être complet, si vous souhaitez tarer le fichier en arrière-plan, utilisez la réponse de @ Shadur et ajoutez & à la fin:

tar -zcvf archive.tar.gz directory/ &
2
shiramy

Je recommande d'utiliser pigz (Implémentation parallèle de GZip)

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

2
nyxee

La réponse à la question "Puis-je compresser un dossier entier en utilisant Zip sur Linux?" est d'utiliser la syntaxe:

Zip -r <Zip file name> <folder to Zip>
2
ize

Si votre tar Linux ne prend pas en charge le -z option, vous pouvez utiliser les éléments suivants:

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