Zip tous les fichiers dans le répertoire ?

Existe-t-il un moyen de compresser tous les fichiers d'un répertoire donné avec la commande zip ? J'ai entendu parler de l'utilisation de *.*, mais je voudrais que cela fonctionne aussi pour les fichiers sans extension.

Solution

Vous pouvez simplement utiliser * ; il n'y a pas besoin de *.*. Les extensions de fichiers ne sont pas spéciales sous Unix. * correspond à zéro caractère ou plus, y compris un point. Il correspond donc à foo.png, parce que c'est zéro caractère ou plus (sept, pour être exact).

Notez que par défaut, * ne correspond pas aux fichiers commençant par un point (ni à *.*). C'est souvent ce que vous voulez. Sinon, en bash, si vous faites shopt -s dotglob, il le fera (mais exclura toujours . et ..). D'autres shells ont des méthodes différentes (ou aucune) pour inclure les dotfiles.

Alternativement, zip a aussi une option -r (récursive) pour faire des arborescences entières de répertoires en une fois (et ne pas avoir à se soucier du problème des dotfiles) :

zip -r myfiles.zip mydir

mydir est le répertoire contenant vos fichiers. Notez que le zip produit contiendra la structure du répertoire ainsi que les fichiers. Comme le souligne peterph dans son commentaire, ceci est généralement considéré comme une bonne chose : l'extraction du zip permettra de stocker proprement tous les fichiers extraits dans un sous-répertoire.

Vous pouvez aussi dire à zip de ne pas stocker les chemins avec l'option -j/--junk-paths.

La commande zip est fournie avec une documentation qui vous informe sur toutes ses (nombreuses) options ; tapez man zip pour voir cette documentation. Ceci n'est pas propre à zip ; vous pouvez obtenir de la documentation pour la plupart des commandes de cette façon.

Commentaires (16)

Dans mon cas, je voulais compresser chaque fichier dans sa propre archive, donc j'ai fait ce qui suit (dans zsh) :

$ for file in *; do zip ${file%.*}.zip $file; done
Commentaires (3)

Une autre façon serait d'utiliser find et xargs : (ceci pourrait inclure un répertoire &quot ;.&quot ; dans le zip, mais il devrait quand même extraire correctement. Avec mon test, zip a supprimé le point avant la compression) find . -type f -exec zip zipfile.zip {} +

(Le + peut être remplacé par ; si votre version de find ne supporte pas la fin + pour exec. Ce sera cependant plus lent...)

Ceci inclura par défaut tous les sous-répertoires. Sur GNU find, -maxdepth peut empêcher cela.

Commentaires (1)