web-dev-qa-db-fra.com

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 veux que cela fonctionne aussi pour les fichiers sans extension.

523
tkbx

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

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.

753
derobert

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
15
Radon Rosborough

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.

8
Gert van den Berg

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.

2