Extraiga varios archivos zip, cada uno en una nueva carpeta con el mismo nombre, a través del terminal Ubuntu


37

Tengo muchos archivos zip a.zip, b.zip, c.zip, ... y quiero extraer cada uno de ellos en las nuevas carpetas a, b, c, ... respectivamente, a través del terminal.

En realidad, lo que quiero es una solución que pueda usar más adelante con un findporque realmente tengo muchas carpetas 2014, 2013, 2012, ... cada una de ellas contiene muchos archivos zip a.zip, b.zip, etc. Si lo hago find . -name "*.zip" -exec {} unzip \;descomprimirá todos los archivos y los colocará en su respectiva carpeta principal.


Respuestas:


72

Debería poder utilizar la -dopción de descomprimir para establecer un directorio alternativo para el contenido del archivo.

unzip -d a a.zip
unzip -d b b.zip

y así. Dentro de una findexpresión, debe poder derivar el nombre del directorio del nombre del archivo zip utilizando la expansión de parámetros de shell, por ejemplo

find -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;

Pruébelo primero agregando un echoie

find -name '*.zip' -exec sh -c 'echo unzip -d "${1%.*}" "$1"' _ {} \;

o algo así

while read -rd $'\0' f; do 
  unzip -d "${f%.*}" "$f"
done < <(find -name '*.zip' -print0)

2
+1 para el test it first…papel
mrzmyr

2
findnecesita un directorio, entoncesfind . -name ...
slf

@slf POSIXly, sí, pero no en el caso de GNU find( "Si no se especifica un punto de partida, .se supone" )
steeldriver

10

Vine a buscar esto yo mismo, solo para darme cuenta de que ya lo había hecho con otros comandos y que podría aplicarse a casi cualquier otra cosa, como ya lo estaba haciendo.

El método de búsqueda es una locura demasiado complicada sin ninguna razón.

for i in *.zip; do unzip "$i" -d "${i%%.zip}"; done

Esta es sin duda la mejor respuesta a la pregunta en cuestión. El anterior es ridículo y el siguiente no se clasifica en las carpetas raíz respectivas de los archivos.
TheMegolith

¿Cómo se podría crear el directorio sin el .zipsufijo? Pidiendo un amigo.
dashard

La respuesta no crea un directorio con un sufijo .zip, ese es el punto de la porción dentro de las llaves.
kencinder

6

Simplemente use

unzip '*.zip' -d /home/user/folder/

11
A menos que me falte algo, esto descomprimirá todo en / home / user / folder, no en / home / user / folder / a y / home / user / folder / b
M. Justin

1

También necesitaba hacer esto usando unrar. Esto se puede lograr mediante una modificación menor al código de kencinder.

for i in *.rar; do mkdir "${i%%.rar}"; unrar x -r "$i" "${i%%.rar}"; done 

PD: ¡Quería agregar esto como un comentario pero no tengo suficientes puntos de reputación!

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.