Puis-je zipper un dossier entier en utilisant gzip?

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

Non.

Contrairement à zip , gzip fonctionne uniquement comme un algorithm de compression.

Pour diverses raisons dont certaines remontent à l'ère des lecteurs de bandes, Unix utilise un programme nommé tar pour archiver des données, qui peuvent ensuite être compressées avec un programme de compression comme gzip , bzip2 , 7zip , etc.

Afin de "zipper" un directory, la command correcte serait

 tar -zcvf archive.tar.gz directory/ 

Cela indiquera tar pour c (créer) une archive à partir des files dans le directory ( tar est récursif par défaut), le compresser en utilisant l'algorithm z (gzip), stocker la sortie comme file f nommé archive.tar.gz , et v (verbosely) list (sur / dev / stderr afin de ne pas affecter les commands pipées) tous les files qu'il ajoute à l'archive.

La command tar offre un support gzip (via le drapeau -z ) pour votre commodité. La command / lib de gzip est complètement séparée. La command 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 directory courant que vous utiliseriez

 tar -zxvf archive.tar.gz 

Cette command est effectivement la même que

 gunzip < archive.tar.gz | tar -xv 

tar a beaucoup, beaucoup, BEAUCOUP d'autres options et usages aussi; Je recommand chaleureusement la lecture à travers sa page de manuel parfois.

La command gzip ne compressera pas récursivement un directory dans un seul file zip, lors de l'utilisation du commutateur -r . Plutôt, il marchera sur cette structure de directorys et zippera chaque file qu'il trouve dans un file séparé.

Exemple

avant

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

maintenant exécutez la command 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 zipper la structure de directorys, vous souhaiterez probablement utiliser la command tar , puis compresser le file .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 

Le résultat est le 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 

J'ai scripté ces 2 commands:

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 

(!!!) S'il vous plaît tester avant utilisation (comme il y a un 'rm -f' qui pourrait potentiellement supprimer des données importantes si utilisé de manière inhabituelle).

Comment utiliser

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

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

gunzipdir /home/MyDirectory.tgz

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

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

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

Je recommand d'utiliser pigz ( mise en parallèle de GZip )

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

La réponse à la question "Puis-je zipper un dossier entier en utilisant gzip?" Est d'utiliser la syntaxe:

 zip -r <zip file name> <folder to zip>