J'essaie de compresser un dossier sous Unix. Cela peut-il être fait en utilisant la commande gzip?
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.
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.
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/
$ 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
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.
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/ &
Je recommande d'utiliser pigz
(Implémentation parallèle de GZip)
tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz
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>
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