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 veux que cela fonctionne aussi pour les fichiers sans extension.
Vous pouvez simplement utiliser *
; il n'y a pas besoin de *.*
. Les extensions de fichier ne sont pas spéciales sur Unix. *
correspond à zéro ou plusieurs caractères, y compris un point. Cela correspond donc à foo.png
, car c'est zéro ou plusieurs caractères (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 tu veux. Sinon, en bash, si vous shopt -s dotglob
il le fera (mais exclura toujours .
et ..
). D'autres shells ont différentes manières (ou pas du tout) d'inclure des fichiers dot.
Alternativement, Zip
a également un -r
(récursif) option pour faire des arborescences de répertoires entières à la fois (et ne pas avoir à se soucier du problème du fichier dot):
Zip -r myfiles.Zip mydir
où 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 Peter dans son commentaire, cela est généralement considéré comme une bonne chose: extraire le Zip stockera soigneusement tous les fichiers extraits dans un sous-répertoire.
Vous pouvez également demander à Zip de ne pas stocker les chemins d'accès avec le -j
/--junk-paths
option.
La commande Zip
est livrée avec une documentation vous expliquant toutes ses (nombreuses) options; tapez man Zip
pour voir cette documentation. Ce n'est pas unique à Zip; vous pouvez obtenir la documentation de la plupart des commandes de cette façon.
Dans mon cas, je voulais compresser chaque fichier dans sa propre archive, j'ai donc fait ce qui suit (dans zsh
):
$ for file in *; do Zip ${file%.*}.Zip $file; done
Une autre façon serait d'utiliser find et xargs: (cela pourrait inclure un répertoire "." Dans le Zip, mais il devrait quand même être extrait 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 prend pas en charge +
fin pour l'exec. Mais ce sera plus lent ...)
Cela inclura par défaut tous les sous-répertoires. On GNU find -maxdepth
peut empêcher cela.
Une autre méthode (lente) pour ce faire (qui ajoute un fichier au Zip à la fois):
for f in * .[^.]*; do
[ -r "$f" ] || continue # Skip directories or non-existant files (Probably ".[^.]*" if directory has no dotfiles). Using -e will allow directories to be used as well
Zip zipfile.Zip "$f" # If directories are included, you probably want to add -r
done
Cela a les problèmes de fichier dot de *
(solution de contournement ajoutée) et démarrerait Zip une fois pour chaque fichier, en l'ajoutant à l'archive. Dans bash
, il traiterait une grande quantité de fichiers.
Ce serait plus lent que la plupart des autres méthodes, mais c'est relativement simple.