commande pour compresser plusieurs répertoires en fichiers zip individuels


40

J'ai un seul répertoire qui contient des dizaines de répertoires à l'intérieur.

Je suis nouveau sur la ligne de commande et j'ai du mal à trouver une commande qui compressera chaque sous-répertoire dans un fichier sous-répertoire.zip unique.

En fin de compte, mon répertoire principal sera rempli de tous mes sous-répertoires d'origine, ainsi que des .zipfichiers correspondants contenant le contenu compressé de chaque sous-répertoire.

Est-ce que quelque chose comme ça est possible? Si oui, s'il vous plaît, montrez-moi comment c'est fait.


Je vous suggère de regarder comment "pour les boucles" peut être fait dans la coquille. Il existe des spécialistes en ligne qui peuvent faire ce que vous voulez, mais une belle boucle sera beaucoup plus claire.
Lynxlynxlynx

Cela signifie-t-il que je dois écrire un script shell distinct, puis appeler ce script à partir de la ligne de commande? Désolé pour une question aussi élémentaire. Bien que je connaisse une certaine expérience en programmation, cette chose est nouvelle pour moi.
Evster

Réponses:


76

Vous pouvez utiliser cette boucle dans bash:

for i in */; do zip -r "${i%/}.zip" "$i"; done

iest le nom de la variable de boucle. */signifie tous les sous-répertoires du répertoire courant et inclura une barre oblique finale dans ces noms. Assurez-vous d'être cdau bon endroit avant d'exécuter ceci. "$i"nomme simplement ce répertoire, y compris le slash final. Les guillemets garantissent que les espaces dans le nom du répertoire ne poseront pas de problème. ${i%/}est comme, $imais avec la barre oblique de fin supprimée, vous pouvez donc l'utiliser pour construire le nom du fichier zip.

Si vous voulez voir comment cela fonctionne, incluez un echoavant le zipet vous verrez les commandes imprimées au lieu d’exécutées.


Merci ça a l'air super! Cependant, un problème potentiel auquel j'ai pensé est-ce que cela va compresser TOUS les répertoires de chaque sous-répertoire en fichiers séparés? Je souhaite uniquement compresser les sous-répertoires de premier niveau en tant que fichiers compressés uniques. Je ne souhaite pas créer de fichiers zip supplémentaires pour les sous-répertoires de niveau 2, 3, etc. ... Merci de me faire savoir si cela a du sens. Merci encore!
Evster

Seuls ceux du premier niveau, comme vous l'avez demandé.
lynxlynxlynx

Les */noms sont attribués à tous les sous-répertoires directs et non à tous les répertoires descendants. Ainsi, vous obtiendrez uniquement des fermetures à glissière pour le niveau le plus élevé, comme vous le souhaitez. La version qui echoy figure aurait démontré cet aspect. Zipper chaque répertoire imbriqué dans son propre fichier serait en fait plus de travail, et probablement mieux résolu en utilisant d' find -type dautres astuces.
MvG

1
@fritzmg: Un test local sur mon Linux suggère que oui, les fichiers commençant par un point sont inclus. Ce serait une propriété de l'outil Info-ZIP, pas de la commande que j'ai donnée, donc selon votre zipcomportement binaire, vous risquez d'obtenir un comportement différent. Afin de créer également des fichiers zip pour les répertoires de niveau supérieur (c'est-à-dire les enfants du répertoire en cours) commençant par un point, vous pouvez également utiliser shopt -s dotglobpour que les modèles globaux correspondent aux fichiers cachés.
MVG

1
Pour créer un zip qui n'a pas le répertoire parent comme racine:for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done
chris
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.