Existe-t-il un moyen de compresser tous les fichiers dun répertoire donné avec la commande zip
? Jai « entendu parler de lutilisation de *.*
, mais je souhaite que cela fonctionne également pour les fichiers sans extension.
Commentaires
- Avez-vous essayé de remonter dun niveau à partir du répertoire souhaité et de faire
zip myarch.zip mydir/*
? - ou mieux
zip -r myarch.zip mydir/*
- ou mieux
zip -r myarch.zip mydir
-
*.*
signifie tout fichier avec un point. Dans cp / m et dos tous les fichiers avaient un point, et cela vous a obligé à le taper (impossible de le faire*
). Par conséquent, les gens sont venus voir*.*
comme 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 comportant un point sur Windows, vous devez taper*.*.*
.
Réponse
Vous pouvez simplement utiliser *
; ce nest pas nécessaire pour *.*
. Les extensions de fichier ne sont pas spéciales sous Unix. *
correspond à zéro ch ou plus caractères — y compris un point. Donc, cela correspond à foo.png
, car il « sagit de 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 *.*
). Cest souvent ce que vous voulez. Sinon, dans bash, si vous shopt -s dotglob
il le fera (mais exclura toujours .
et ..
). Dautres shells ont différentes manières (voire aucune) dinclure des fichiers dot.
Alternativement, zip
a également un -r
Option (récursive) pour faire des arborescences de répertoires entières à la fois (et ne pas avoir à vous soucier du problème de dotfile):
zip -r myfiles.zip mydir
où mydir
est le répertoire contenant vos fichiers. Notez que le zip produit contiendra la structure des répertoires ainsi que les fichiers. Comme le souligne Peterph dans son commentaire, cela est généralement considéré comme une bonne chose: lextraction du zip stockera parfaitement tous les fichiers extraits dans un sous-répertoire.
Vous pouvez également dire à zip de ne pas stocker les chemins avec le -j
/ --junk-paths
option.
La commande zip
est fournie avec documentation vous informant de toutes ses (nombreuses) options; tapez man zip
pour voir cette documentation. Ce nest pas unique à zip; vous pouvez obtenir de la documentation pour la plupart des commandes de cette façon.
Commentaires
Réponse
Dans mon cas, je voulais compresser chaque fichier dans sa propre archive, jai donc fait ce qui suit (dans zsh
):
$ for file in *; do zip ${file%.*}.zip $file; done
Commentaires
- Là ‘ nest pas
mkv
ici? De plus, rien ici nest 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. - @tripleee Premièrement, merci davoir signalé ma référence erronée à
mkv
. Deuxièmement, il est inutile de citer des arguments danszsh
, contrairement àbash
. Cest ‘ pourquoi jai spécifié quil sagissait dune commande pourzsh
. - Remplacement du dernier point-virgule par une esperluette pourrait laccélérer considérablement (si le nombre de fichiers dans le répertoire est raisonnable …). Sinon
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 …) (Beaucoup de dépendances GNU …) - pour compresser chaque fichier dans sa propre archive, faites
gzip *
Réponse
Une autre façon serait dutiliser 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 compression) find . -type f -exec zip zipfile.zip {} +
(Le +
peut être remplacé par \;
si votre version de find
ne prend pas en charge la +
end pour exec. Cela sera cependant plus lent …)
Cela inclura par défaut tous les sous-répertoires. Sur GNU, trouver -maxdepth
peut empêcher cela.
Commentaires
- (contrairement aux solutions utilisant
*
, cela inclura les fichiers dotfiles et ne ‘ t tomber sil y a trop de fichiers dans un répertoire)
Réponse
Une autre méthode (lente) pour faire ceci (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 de points de *
(solution de contournement ajoutée) et commencerait zip une fois pour chaque fichier, lajoutant à larchive. Dans bash
, cela traiterait un grand nombre de fichiers.
Ce serait plus lent que la plupart des autres méthodes, mais cest relativement simple.
Commentaires
- Je dirais que cest moins simple que la réponse acceptée, et plus lent, ce qui pose la question: » Pourquoi quelquun ferait-il cela? « . Si vous pouvez répondre à cette question, je vous recommande de mettre ce contexte dans votre réponse, sinon je pense que cest une mauvaise réponse à une vieille question qui a déjà une bonne réponse.
- @Centimane: je note les limites . Je pense que cela a une valeur éducative. (Si vous ne sautez pas de répertoires, cest assez simple). Si vous voulez une réponse beaucoup plus rapide en utilisant un outil externe (standard) à la place, mon autre réponse couvre cela. (avec la gestion des dotfiles supprimée (ce qui affecte lexactitude sans leur absence mentionnée dans la question), je trouve que cest assez élégant):
for f in *; do zip zip.zip "$f"; done
- Notez que laccepté La réponse nutilise ‘ pas une commande externe et serait plus rapide. Dans quel scénario cette réponse serait-elle utile?
- @Centimane Avec tar quand il y a plus de fichiers que ce que bash peut passer en paramètres. (find + xargs sont meilleurs, car les boucles sont plus faciles …). Cest une réponse (unique) à la question. Ce nest certainement pas la réponse optimale. (Des réponses non optimales peuvent toujours être utiles pour des problèmes similaires, si quelquun a une situation légèrement différente – par exemple, vouloir fichier tar dans tous les répertoires)
*
shell-globbing ne ‘ ninclut pas les fichiers dotfiles (cest-à-dire les noms de fichiers commençant par.
). Cest un autre avantage de compresser tout le répertoire par son nom..
et..
?