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 

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

  • Vous voudrez peut-être ajouter que cest considéré comme une bonne pratique de contenir tout ce qui se trouve dans larchive dans un répertoire de premier niveau – afin que lon ne ‘ polluer son répertoire actuel lors de lextraction.
  • @peterph fait. Bien que ce soit moins une convention dans les fichiers zip que dans les fichiers tar, par exemple, jai ‘ peur.
  • malheureusement oui. Probablement à cause des fenêtres héritage du glisser ‘ n ‘ déposer sur le bureau et lhéritage Linux de lutilisation des codes sources.
  • sachez que * 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.
  • Mais lutilisation de -r inclut le répertoire lui-même, ce qui rompt ce que je ‘ m faire. Est-ce que ‘ t * inclure . et ..?

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èrement zsh -spécifique. Vous ‘ voudrez bien citer toute variable contenant un nom de fichier, donc zip "${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 dans zsh, contrairement à bash. Cest ‘ pourquoi jai spécifié quil sagissait dune commande pour zsh.
  • 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)

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *