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 .zip
fichiers 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.
command-line
directory
zip
Evster
la source
la source
Réponses:
Vous pouvez utiliser cette boucle dans
bash
:i
est 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'êtrecd
au 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,$i
mais 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
echo
avant lezip
et vous verrez les commandes imprimées au lieu d’exécutées.la source
*/
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 quiecho
y 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 d
autres astuces.zip
comportement 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 utilisershopt -s dotglob
pour que les modèles globaux correspondent aux fichiers cachés.for i in */; do (cd "$i"; zip -r "../${i%/}.zip" .); done