J'ai plus de 200% de.zip
fichiers dans un dossier. Je ne veux pas les décompresser un par un. Je veux extraire ceux qui utilisent une seule commande ou un script. Comment faire cela.
Si vous voulez vraiment les décompresser en parallèle, vous pouvez faire
for i in *zip; do unzip "$i" & done
Cela lancera cependant N processus pour les fichiers Nzip et pourrait être très lourd pour votre système. Pour une approche plus contrôlée, en 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, remplacez -P
par ce que vous voulez. Si vous ne voulez pas recurse dans des sous-répertoires, faites ceci à la place:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Vous pouvez également installer le parallèle GNU , comme suggéré par @OleTange dans les commentaires, puis exécutez
.parallel unzip ::: *zip
La commande parallèle GNU est bien adaptée à ce type de choses. Après:
$ sudo apt-get install parallel
Alors
ls *.zip | parallel unzip
Ceci utilisera autant de cœurs que vous avez, gardant chaque noyau occupé avec une décompression jusqu'à ce qu'ils soient tous terminés.
Vous pouvez utiliser la commande suivante:
Commencez par changer le répertoire du terminal en un répertoire contenant des fichiers .zip:
cd /path
Ensuite, exécutez cette commande pour décompresser tous les fichiers .zip:
for z in *.zip; do unzip "$z"; done
Si vous avez plusieurs fichiers .zip
dans votre dossier et que vous souhaitez tous les décompresser, ouvrez le terminal et accédez à votre dossier à l'aide de:
cd <path_to_folder>
Maintenant, utilisez cette commande pour décompresser tout votre fichier .zip
:
ls *.zip | xargs -n1 unzip
Vous pouvez utiliser find avec -exec
comme suit,
find . -name "*.zip" -exec unzip {} \;
Cela fonctionnera si le fichier contient un espace dans le nom.
unzip \*.zip
ou unzip '*.zip'
L'évidente unzip *.zip
ne fonctionne pas, car le shell le développe en tant que unzip foo.zip bar.zip ...
et unzip
interprète le premier nom de fichier en tant que fichier zip et les noms de fichiers suivants en tant que fichiers à extraire de ce fichier zip.
Cependant, unzip
est un peu inhabituel parmi les commandes Unix dans la mesure où il effectue ses propres développements globaux. Si le shell ne développe pas *
, unzip le fera et interprètera tous les noms de fichiers obtenus en tant que fichiers zip à traiter. Donc, dans ce cas particulier, on peut s’échapper sans une boucle for
ou un xargs
ou autre.
Lire d'autres questions sur les étiquettes bash