Tengo más de 200 .zip
archivos en una carpeta. No quiero descomprimirlos uno por uno. Quiero extraer aquellos usando un solo comando o script Como hacer eso.
27
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 axargs
. 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:
Luego
Esto usará todos los núcleos que tenga, manteniendo cada núcleo ocupado con un descomprimir, hasta que todos estén listos.
fuente
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 usarls
. Globbing y un bucle while es lo más seguro.Puede usar el siguiente comando:
Primero cambie el directorio en la terminal al directorio que contiene archivos .zip:
Luego ejecute este comando para descomprimir todos los archivos .zip:
fuente
Si tienes muchos
.zip
archivos en su carpeta y desea descomprimirlos, abra el terminal y vaya a su carpeta usando:Ahora use este comando para descomprimir todo su
.zip
archivo:fuente
echo *.zip
para evitar que un posiblels
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,Esto va a funcionar si el archivo tiene un espacio en el nombre.
fuente
Un método no terminal.
Simplemente seleccione los archivos zip, haga clic derecho en uno y elija
extract here
. Puede seleccionar todos o solo una cantidad de archivos zip a la vez.fuente
unzip \*.zip
ounzip '*.zip'
Lo obvio
unzip *.zip
no funciona, porque el shell lo expandeunzip foo.zip bar.zip ...
eunzip
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 unfor
bucle oxargs
similar.fuente