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é.
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/
$ 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>