Respuestas:
Si realmente quieres descomprimirlos en paralelo, puedes hacer
for i in *zip; do unzip "$i" & done
Sin embargo, eso lanzará N procesos para archivos N .zip y podría ser muy pesado en su sistema. Para un enfoque más controlado, lanzando solo 10 procesos paralelos a la vez, intente esto:
find . -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Para controlar la cantidad de procesos paralelos iniciados, cambie -P
a lo que desee. Si no desea recurse a subdirectorios, haga esto en su lugar:
find . -maxdepth 1 -name '*.zip' -print0 | xargs -0 -I {} -P 10 unzip {}
Alternativamente, puede instalar GNU paralelo como lo sugiere @OleTange en los comentarios y ejecutar
parallel unzip ::: *zip
-exec
o en -execdir
lugar de tubería a xargs
. No solo es más fácil de entender, sino que también es menos propenso a errores y utiliza menos recursos del sistema. find . -name '*.zip' -exec unzip {} ';'
(Debe citar el punto y coma.)
-exec \;
(puede escapar del punto y coma, sin necesidad de comillas), ejecutará cada comando secuencialmente. -exec +
es mejor, pero no funcionará aquí, ya que no es así unzip
.
El comando paralelo GNU es muy adecuado para este tipo de cosas. Después:
$ sudo apt-get install parallel
Luego
ls *.zip | parallel unzip
Esto usará todos los núcleos que tenga, manteniendo cada núcleo ocupado con un descomprimir, hasta que todos estén listos.
echo *.zip
en su lugar para evitar que un posible alias ls ingrese información adicional. Sin embargo, esto tiene el mismo problema que la respuesta de @ Guru, se rompe en los nombres de archivo que contienen espacios en blanco.
xargs
GNU Parallel no se rompe en los nombres de archivo que contienen espacios / tabuladores / comillas. Solo si los nombres de los archivos contienen nuevas líneas, deberá tener especial cuidado. Por ejemplo, usando:parallel unzip ::: *.zip
echo
es tan malo como usar ls
. Globbing y un bucle while es lo más seguro.
Si tienes muchos .zip
archivos en su carpeta y desea descomprimirlos, abra el terminal y vaya a su carpeta usando:
cd <path_to_folder>
Ahora use este comando para descomprimir todo su .zip
archivo:
ls *.zip | xargs -n1 unzip
echo *.zip
para evitar que un posible ls
alias filtre información adicional, sin embargo, eso aún no soluciona el problema del espacio en blanco.
ls
scripts, ya que su salida no está bien definida entre versiones. En cambio, mire la respuesta de @terdon, ya que resuelve todos los problemas de esta solución.
Puedes usar find con -exec
like,
find . -name "*.zip" -exec unzip {} \;
Esto va a funcionar si el archivo tiene un espacio en el nombre.
unzip \*.zip
o unzip '*.zip'
Lo obvio unzip *.zip
no funciona, porque el shell lo expande unzip foo.zip bar.zip ...
e unzip
interpreta el primer nombre de archivo como el archivo zip, y los siguientes nombres de archivo como archivos para extraer de ese archivo zip.
Sin embargo, unzip
es un poco inusual entre los comandos de Unix ya que realiza sus propias expansiones globales. Si el *
shell no lo expande, descomprimir lo hará e interpretará todos los nombres de archivo resultantes como archivos zip para procesar. Entonces, en este caso especial, uno puede escapar sin un for
bucle o xargs
similar.