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 va compresser chaque sous-répertoire dans un fichier sous-répertoire.zip unique.
Donc, à la fin, mon répertoire principal sera rempli de tous mes sous-répertoires d'origine, plus le .zip
correspondant fichiers contenant le contenu compressé de chaque sous-répertoire.
Est-ce que quelque chose comme ça est possible? Si oui, montrez-moi comment c'est fait.
Réponse acceptée :
Vous pouvez utiliser cette boucle dans bash
:
for i in */; do zip -r "${i%/}.zip" "$i"; done
i
est le nom de la variable de boucle. */
signifie chaque sous-répertoire du répertoire courant et inclura une barre oblique finale dans ces noms. Assurez-vous d'avoir cd
au bon endroit avant de l'exécuter. "$i"
nomme simplement ce répertoire, y compris la barre oblique finale. Les guillemets garantissent que les espaces blancs dans le nom du répertoire ne causeront pas de problèmes. ${i%/}
est comme $i
mais avec la barre oblique finale 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 le zip
et vous verrez les commandes imprimées au lieu d'être exécutées.
Exécution parallèle
Pour les exécuter en parallèle, vous pouvez utiliser &
:
for i in */; do zip -0 -r "${i%/}.zip" "$i" & done; wait
Nous utilisons wait
pour indiquer au shell d'attendre que toutes les tâches en arrière-plan soient terminées avant de quitter.
Attention, si vous avez trop de dossiers dans votre répertoire actuel, vous risquez de surcharger votre ordinateur car ce code ne limite pas le nombre de tâches parallèles.