J'ai plus de 200 .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 seul script. Comment faire ça.
27
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 pourxargs
. 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 çaunzip
marche.La commande parallèle GNU est bien adaptée à ce type de chose. Après:
ensuite
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.
la source
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 utilisantls
. Globbing et une boucle while sont les plus sûrs.Vous pouvez utiliser la commande suivante:
Changez d'abord le répertoire du terminal en un répertoire contenant des fichiers .zip:
Exécutez ensuite cette commande pour décompresser tous les fichiers .zip:
la source
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:Utilisez maintenant cette commande pour décompresser tout votre
.zip
fichier:la source
echo *.zip
place pour empêcher unls
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,Cela va fonctionner si le fichier a un espace dans le nom.
la source
Une méthode non terminale.
Sélectionnez simplement les fichiers zip, faites un clic droit sur l'un et choisissez
extract here
. Vous pouvez sélectionner tout ou seulement un certain nombre de fichiers zip à la fois.la source
unzip \*.zip
ouunzip '*.zip'
L'évident
unzip *.zip
ne fonctionne pas, car le shell le développeunzip foo.zip bar.zip ...
etunzip
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 sansfor
boucle ouxargs
similaire.la source