Est-il possible de compresser tous les fichiers d'un répertoire donné avec la zip
commande? J'ai entendu parler de l'utilisation *.*
, mais je veux que cela fonctionne aussi pour les fichiers sans extension.
483
Est-il possible de compresser tous les fichiers d'un répertoire donné avec la zip
commande? J'ai entendu parler de l'utilisation *.*
, mais je veux que cela fonctionne aussi pour les fichiers sans extension.
zip myarch.zip mydir/*
?zip -r myarch.zip mydir/*
zip -r myarch.zip mydir
*.*
signifie tout fichier avec un point. Dans cp / m et dos, tous les fichiers avaient un point, ce qui vous a fait taper (impossible*
). Par conséquent, les gens sont venus voir*.*
tous les fichiers. Finalement, Microsoft a ajouté des noms de fichiers longs qui pourraient avoir zéro ou plus de points. Pour trouver un fichier qui a un point sur Windows, vous devez taper*.*.*
.Réponses:
Vous pouvez simplement utiliser
*
; il n'y a pas besoin de*.*
. Les extensions de fichier ne sont pas spéciales sous Unix.*
correspond à zéro ou plusieurs caractères, y compris un point. Donc, ça correspondfoo.png
, parce que c'est zéro ou plusieurs caractères (sept, pour être exact).Notez que
*
par défaut, les fichiers commençant par un point ne correspondent pas*.*
. C'est souvent ce que tu veux. Si ce n'est pas le cas, en bash, si vousshopt -s dotglob
le ferez (tout en excluant.
et..
). D'autres coquilles ont différentes manières (voire aucune) d'inclure des fichiers de points.Alternativement, a
zip
aussi une-r
option (récursive) pour faire des arbres de répertoires entiers à la fois (sans avoir à vous soucier du problème de fichier de points):où
mydir
est le répertoire contenant vos fichiers. Notez que le zip produit contiendra la structure de répertoires ainsi que les fichiers. Comme le souligne peterph dans son commentaire, ceci est généralement considéré comme une bonne chose: extraire le zip stockera proprement tous les fichiers extraits dans un seul sous-répertoire.Vous pouvez également dire à zip de ne pas stocker les chemins avec l' option
-j
/--junk-paths
.La
zip
commande est livrée avec une documentation vous expliquant toutes ses (nombreuses) options; tapezman zip
pour voir cette documentation. Ce n'est pas unique à zip; vous pouvez obtenir la documentation pour la plupart des commandes de cette façon.la source
*
shell-globbing n'inclut pas les fichiers de points (c'est-à-dire les noms de fichiers commençant par.
). Ceci est un autre avantage à compresser le répertoire entier par nom..
et..
?Dans mon cas, je voulais compresser chaque fichier dans ses propres archives. J'ai donc fait ce qui suit (en
zsh
):la source
mkv
ici? De plus, rien ici n'est particulièrementzsh
spécifique. Vous voudrez bien citer toute variable contenant un nom de fichier, donczip "${file%.*}.zip" "$file"
avec les guillemets doubles autour des deux variables.mkv
. Deuxièmement, il est inutile de citer des arguments danszsh
, contrairement à dansbash
. C'est pourquoi j'ai précisé qu'il s'agissait d'une commandezsh
.find . -type f -maxdepth 1 -print0|xargs -r0 -n1 -P64 -I{} bash -c 'f="{}"; zip "${f%.*}.zip" "$f"'
(avec-P
ajusté en fonction de vos threads CPU ...) (De nombreuses dépendances GNU ...)Une autre façon serait d'utiliser find et xargs: (cela pourrait inclure un répertoire "." Dans le zip, mais il devrait toujours ê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 defind
ne supporte pas la+
fin pour exec. Ce sera plus lent cependant ...)Cela inclura par défaut tous les sous-répertoires. Trouver sur GNU
-maxdepth
peut empêcher cela.la source
*
, cela inclura les fichiers de points et ne tombera pas s'il y a trop de fichiers dans un répertoire)Une autre méthode (lente) pour faire cela (qui ajoute un fichier à la fois au zip):
Cela a les problèmes de fichier de points de
*
(solution de contournement ajoutée) et serait démarrer zip une fois pour chaque fichier, en l'ajoutant à l'archive. Dansbash
, il traiterait une grande quantité de fichiers.Ce serait plus lent que la plupart des autres méthodes, mais c'est relativement simple.
la source
for f in *; do zip zip.zip "$f"; done