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.

Miguel
fuente

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)
conductor de acero
fuente
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
kencinder
fuente
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/
James Muller
fuente
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!

Atul Singh Arora
fuente