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

407

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

utilisateur1269502
la source
6
vous pouvez utiliser gzip -r myfolderquels fichiers gzip récursivement. De la même manière, vous pouvez décompresser des fichiers à l'aide de ceux gunzip -r myfolder qui le seront de manière récursive. Pour plus d'informations, man gzip
Valentin Bajrami
12
Utilisation tar; il prend en charge les options de compression. gzipest conçu comme un complément à tar, pas comme un remplacement.
devnull
13
Notez que la suggestion de @ val0x00ff n'est certainement pas ce que vous voulez accomplir.
Shadur
4
@Shadur c'est pourquoi je l'ai posté commentcar ce n'était pas la réponse à sa question.
Valentin Bajrami
2
Démonstration de ce que @Shadur signifie. Fichiers donnés 1et 2sous dossier playground. gzip -r ./playgroundvous donnera 1.gzet 2.gz(et pas plus 1et les 2fichiers) dans le dossier playground, PAS un fichier compressé avec tout ce qu'il contient.
Jeff Xiao

Réponses:

660

Non.

Contrairement à zip, gzipfonctionne comme un algorithme de compression uniquement .

En raison de diverses raisons dont certaines à l'écouterait - retour ère des lecteurs de bande, Unix utilise un programme nommé tarpour archiver les données, qui peuvent ensuite être compressé avec un programme de compression comme gzip, bzip2, 7zip, etc.

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

tar -zcvf archive.tar.gz directory/ 

Cela va dire tarà

  • compressez-le en utilisant l' algorithme z (gzip)

  • c (crée) une archive à partir des fichiers de directory( tarest récursive par défaut)

  • v (verbalement) listez (sur / dev / stderr pour qu’il n’affecte pas les commandes piped) tous les fichiers qu’il ajoute à l’archive.

  • et stocke la sortie dans un f (fichier) nomméarchive.tar.gz

La tarcommande offre un gzipsupport (via le -zdrapeau) uniquement pour votre commodité. La gzipcommande / lib est complètement séparée. La commande ci-dessus est effectivement la même chose que

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

Pour décompresser et décompresser l'archive dans le répertoire actuel, vous utiliseriez

tar -zxvf archive.tar.gz

Cette commande est effectivement la même que

gunzip < archive.tar.gz | tar -xv

tara beaucoup, beaucoup, beaucoup d'autres options et utilisations aussi bien; Je recommande vivement de lire sa page de manuel de temps en temps.

Shadur
la source
51
Pour rendre les choses encore plus explicites, cela équivaut exactement à tar -cv directory | gzip > archive.tar.gz. Les archives résultantes peuvent ensuite être extraites avec tar -zxvfou même zcat file.tar.gz | tar -xv. Le point tar étant que le tar est complètement indépendant du gzip, la tarcommande inclut simplement le support de gzip pour plus de commodité.
Patrick
J'utilise depuis tar cvzfun certain temps. Une chose à noter: si vous utilisez Windows ( 7-zipà spécifier) ​​pour décompresser un *.tar.gzfichier, il faut deux tours. Une pour décompresser un *.tar.gzfichier dans un *.tarfichier, la suivante pour décompresser ce fichier tar dans le contenu d'origine. cela augmente le temps total de décompression, en particulier pour les gros fichiers (les journaux par exemple)
Jeff Xiao
1
La dénomination de l'archive a-t-elle une incidence sur une machine? Je sais que ce serait bien de faire savoir aux utilisateurs l'algorithme utilisé à l'origine pour le compresser (d'où le format .gz), mais à part cela, est-ce que la façon dont vous nommez l'archive est importante?
hello_there_andy
3
@hello_there_andy Cela ne change rien à la plupart des Unix, mais Windows (et la complétion intelligente des onglets sous Linux) font des suppositions basées sur l'extension du nom de fichier.
Shadur
1
@vadimkotov C'est peut-être ce que vous cherchez: superuser.com/questions/168749/…
Shadur
47

La gzipcommande ne compresse pas de manière récursive un répertoire dans un fichier zip unique, lors de l'utilisation du -rcommutateur. Au lieu de cela, il va parcourir cette structure de répertoire et compresser chaque fichier trouvé dans un fichier séparé.

Exemple

avant

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

maintenant lance la gzipcommande

$ 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 de répertoires, vous souhaiterez probablement utiliser la tarcommande, puis compresser le .tarfichier obtenu.

$ 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 entraîne 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
slm
la source
4

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 existe un «rm -f» qui pourrait potentiellement supprimer des données importantes s'il était utilisé de manière peu commune).

Comment utiliser:

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

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

ungzipdir /home/MyDirectory.tgz

Crée / home / MyDirectory et supprime /home/MyDirectory.tgz en cas de succès.

lepe
la source
Pour compresser TOUS les fichiers d'un répertoire: find ./* -maxdepth 0 -type d -exec gzipdir {} \; ( -exec echo {}faites attention à la commande find, testez-la d' abord et assurez-vous de ne pas capturer './', ce qui entraînera la fermeture du répertoire PARENT, ce qui risquerait de casser tout votre répertoire personnel)
Andrew Lorien
1

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

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

Nyxee
la source
Je l'utilise aussi beaucoup (et pixz), mais ça marche quand les redirection des pipes et des sorties entrent en jeu?
Michael Wolf
1

La réponse à la question "Puis-je compresser un dossier entier à l'aide de zip sur linux?" Consiste à utiliser la syntaxe suivante:

zip -r <zip file name> <folder to zip>
ize
la source
Si vous avez une nouvelle question, posez-la en cliquant sur le bouton Poser une question . Incluez un lien vers cette question si cela permet de fournir un contexte. - De l'avis
Jeff Schaller
2
@ JeffSchaller: Ceci est une réponse. C'est un très mauvais problème (je crois), mais c'est clairement une réponse.
Scott
1
@ize: Je suis à peu près sûr que la commande que vous avez publiée n'utilise pas gzip.
Dhag
1
Points pour l'utilisation de zip comme la question posée, l'auteur aurait probablement aimé savoir qu'il était possible de faire exactement la même chose que sur les fenêtres. Il est triste que la plupart des gens ne souhaitent pas penser aussi loin.
Florian Heigl
2
C'est délicat quand la question précise ... "utiliser gzip".
Jeff Schaller
1

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

tar -zcvf archive.tar.gz directory/ &
Shiramy
la source
0

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

tar -cvf - dir | gzip > dir.tar.gz
Jeff
la source