Réponses:
Si vous voulez vraiment les décompresser en parallèle, vous pouvez le faire
for i in *zip; do unzip "$i" & done
Cependant, cela lancera N processus pour N fichiers .zip et pourrait être très lourd sur votre système. Pour une approche plus contrôlée, ne lançant que 10 processus parallèles à la fois, essayez ceci:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Pour contrôler le nombre de processus parallèles lancés, -P
passez à ce que vous voulez. Si vous ne voulez pas recurse dans les sous-répertoires, faites-le à la place:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Alternativement, vous pouvez installer GNU parallel comme suggéré par @OleTange dans les commentaires et exécuter
parallel unzip ::: *zip
-exec
ou -execdir
au lieu de la tuyauterie pour xargs
. Non seulement il est plus simple à comprendre, mais il est également moins sujet aux erreurs et utilise moins de ressources système. find . -name '*.zip' -exec unzip {} ';'
(Vous devez citer le point-virgule.)
-exec \;
(vous pouvez échapper au point-virgule, pas besoin de guillemets), exécutera chaque commande séquentiellement. -exec +
c'est mieux mais ça ne marchera pas ici car ce n'est pas comme ça que ça unzip
marche.
La commande parallèle GNU est bien adaptée à ce type de chose. Après:
$ sudo apt-get install parallel
ensuite
ls *.zip | parallel unzip
Cela utilisera autant de cœurs que vous en avez, en gardant chaque cœur occupé avec une décompression, jusqu'à ce qu'ils soient tous terminés.
echo *.zip
place pour empêcher un alias ls possible de se faufiler dans des informations supplémentaires. Cependant, cela a le même problème que la réponse de @ Guru, il casse les noms de fichiers contenant des espaces.
xargs
GNU Parallel ne se casse pas sur les noms de fichiers contenant espace / tabulation / citation. Ce n'est que si les noms de fichiers contiennent des sauts de ligne que vous devrez faire très attention. Par exemple en utilisant:parallel unzip ::: *.zip
echo
est aussi mauvais qu'en utilisant ls
. Globbing et une boucle while sont les plus sûrs.
Si vous avez de nombreux .zip
fichiers dans votre dossier et que vous souhaitez tous les décompresser, ouvrez le terminal et accédez à votre dossier en utilisant:
cd <path_to_folder>
Utilisez maintenant cette commande pour décompresser tout votre .zip
fichier:
ls *.zip | xargs -n1 unzip
echo *.zip
place pour empêcher un ls
alias possible de se faufiler dans des informations supplémentaires, mais cela ne résout toujours pas le problème des espaces blancs.
ls
pour les scripts, car sa sortie n'est pas bien définie entre les versions. Regardez plutôt la réponse de @terdon car elle résout tous les problèmes de cette solution.
Vous pouvez utiliser find avec -exec
comme ça,
find . -name "*.zip" -exec unzip {} \;
Cela va fonctionner si le fichier a un espace dans le nom.
unzip \*.zip
ou unzip '*.zip'
L'évident unzip *.zip
ne fonctionne pas, car le shell le développe unzip foo.zip bar.zip ...
et unzip
interprète le premier nom de fichier comme le fichier zip et les noms de fichiers suivants comme des fichiers à extraire de ce fichier zip.
Cependant, unzip
est un peu inhabituel parmi les commandes Unix en ce qu'il fait ses propres extensions glob. Si le *
n'est pas développé par le shell, décompressez le fera et interprétera tous les noms de fichiers résultants en tant que fichiers zip à traiter. Donc, dans ce cas particulier, on peut s'en tirer sans for
boucle ou xargs
similaire.