Descomprima todos los archivos en un directorio

203

Tengo un directorio de archivos ZIP (creado en una máquina con Windows). Puedo descomprimirlos manualmente usando unzip filename, pero ¿cómo puedo descomprimir todos los archivos ZIP en la carpeta actual a través del shell?

Usando Ubuntu Linux Server.

Lennie De Villiers
fuente

Respuestas:

395

Esto funciona en bash, de acuerdo con este enlace :

descomprimir \ *. zip

ChristopheD
fuente
2
Necesitaba la barra invertida con Zsh . No sé por qué lo necesitarías si estás usando Bash.
Don McCurdy
¿Qué pasará con los archivos duplicados? ¿Supongo que se anulará?
kerner1000
Funciona muy bien en macOS 😀
Ahi Tuna
1
Al hacer esto consigo nombre de archivo no emparejados para todos los archivos zip en el directorio
thebeancounter
1
La versión con citas funcionó para mí en WSL. Los nombres de archivo también tenían espacios en ellos, FWIW.
Max Candocia
107

Solo ponga algunas citas para escapar del comodín:

unzip "*.zip"
ghostdog74
fuente
2
+1 Este me funcionó. Tuve que descomprimir los nombres de archivo con un formato particular mientras restringía el resto. Simplemente mantuve el formato de coincidencia entre comillas dobles y funcionó a las mil maravillas. La salida me dice la cantidad de archivos procesados ​​con éxito.
Lalit Kumar B
Funcionó muy bien en Ubuntu para el subsistema de Windows, 18/11/2018. La respuesta superior no funcionó.
julianstanley
64

El siguiente script bash extrae todos los archivos zip en el directorio actual en nuevos directorios con el nombre del archivo zip, es decir:

Los siguientes archivos:

myfile1.zip
myfile2.zip 

Se extraerá a:

./myfile1/files...
./myfile2/files...

Script de shell:

#!/bin/sh
for zip in *.zip
do
  dirname=`echo $zip | sed 's/\.zip$//'`
  if mkdir "$dirname"
  then
    if cd "$dirname"
    then
      unzip ../"$zip"
      cd ..
      # rm -f $zip # Uncomment to delete the original zip file
    else
      echo "Could not unpack $zip - cd failed"
    fi
  else
    echo "Could not unpack $zip - mkdir failed"
  fi
done
CONvid19
fuente
44
Esto es lo que debe conquistar todas las cosas. No puedo creer que no se haya votado más alto
billynoah 11/11/2015
Esto no trata con espacios en los nombres de archivo.
David Oliver
1
Simplemente agregue comillas "al nombre del archivo
CONvid19
1
el `me salvó el día! ¡Gracias! Estoy haciendo un bucle, descomprimir, realizar una acción, copiar, grep algo, eliminar. Lo que faltaba era cómo pasar de file.gz a file como variable en el script bash
thahgr el
38

descomprimir * .zip, o si están en subcarpetas, entonces algo como

find . -name "*.zip" -exec unzip {} \;
phatmanace
fuente
descomprimir procesa comodines para que un archivo llamado "* .zip" no haga lo que espera.
geocar
3
En realidad, esto hará exactamente lo que se espera, el resultado de la operación de búsqueda se está pasando a descomprimir
John Bargman
1
Esto extraerá todos los archivos zip en el directorio actual, ¿qué sucede si deseo que los archivos zip (presentes en las subcarpetas) se extraigan en las subcarpetas respectivas?
Rishabh Agrahari
2
@RishabhAgrahari Abordé tu comentario en una nueva respuesta .
jojo
para gzip'edarchivos, use gunzip -rfk .para descomprimir recursivamente dentro de las carpetas respectivas
Devaroop
17

Descomprima todos los .ziparchivos y almacene el contenido en una nueva carpeta con el mismo nombre y en la misma carpeta que el .ziparchivo:

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

Esta es una extensión de la respuesta de @ phatmanace y aborda el comentario de @ RishabhAgrahari :

Esto extraerá todos los archivos zip en el directorio actual, ¿qué sucede si deseo que los archivos zip (presentes en las subcarpetas) se extraigan en las subcarpetas respectivas?

jojo
fuente
1
para gzip'edarchivos, use gunzip -rfk .para descomprimir recursivamente dentro de las carpetas respectivas
Devaroop
2
¿Cómo find: illegal option -- nusar UnZip 6.00 ? ¿Alguien más?
DannyDannyDanny
find . -name '*.zip' -exec sh -c 'unzip -d "${1%.*}" "$1"' _ {} \;Olvidó el listado del directorio.
SaundersB
16
for i in *.zip; do
  newdir="${i:0:-4}" && mkdir "$newdir"
  unzip "$i" -d  "$newdir"
done

Esto descomprimirá todos los archivos zip en nuevas carpetas nombradas con los nombres de los archivos zip.

a.zip b.zip c.zipse descomprimirá en a b ccarpetas respectivamente.

Jahid
fuente
6

aunpack -e *.zip, con atoolinstalado. Tiene la ventaja de que trata los errores de forma inteligente y siempre se descomprime en subdirectorios a menos que el archivo zip contenga solo un archivo. Por lo tanto, no hay peligro de contaminar el directorio actual con una gran cantidad de archivos, ya que existe unzipun zip sin estructura de directorios.

kampu
fuente
6

En cualquier shell POSIX, esto se descomprimirá en un directorio diferente para cada archivo zip:

for file in *.zip
do
    directory="${file%.zip}"
    unzip "$file" -d "$directory"
done
Jeff Fisher
fuente
1
O como una for file in *.zip; do unzip "$file" -d "${file%.zip}"; done
frase
2

Utilizar este:

for file in `ls *.Zip`; do
unzip ${file} -d ${unzip_dir_loc}
done
Ankit Malhotra
fuente
2

for file in 'ls *.zip'; do unzip "${file}" -d "${file:0:-4}"; done

Anurag Dalia
fuente
1
Genial para mi Descomprimir en sus subcarpetas respectivamente
insign
¿Es más seguro hacerlo for file in *.zip; do ...bien?
peterflynn
1

Si los archivos son gzip'd. Entonces solo usa:

gunzip -rfk .

del directorio raíz para extraer archivos de forma recursiva en los directorios respectivos manteniendo los originales (o eliminar -kpara eliminarlos)

Devaroop
fuente
0

Esta es una variante de respuesta Pedro Lobito usando Cómo recorrer un directorio de forma recursiva para eliminar archivos con ciertas enseñanzas de extensiones :

shopt -s globstar
root_directory="."

for zip_file_name in **/*.{zip,sublime\-package}; do
    directory_name=`echo $zip_file_name | sed 's/\.\(zip\|sublime\-package\)$//'`
    printf "Unpacking zip file \`$root_directory/$zip_file_name\`...\n"

    if [ -f "$root_directory/$zip_file_name" ]; then
        mkdir -p "$root_directory/$directory_name"
        unzip -o -q "$root_directory/$zip_file_name" -d "$directory_name"

        # Some files have the executable flag and were not being deleted because of it.
        # chmod -x "$root_directory/$zip_file_name"
        # rm -f "$root_directory/$zip_file_name"
    fi
done
usuario
fuente
-2
for i in `ls *.zip`; do unzip $i; done
Dominik
fuente
14
Uso peligroso de ls. ¿Qué pasa si tiene un archivo llamado "-j -o -d .. jackass.zip"
geocar
-2

Para descomprimir todos los archivos en un directorio simplemente escriba este cmd en la terminal:

unzip '*.zip'
Yacine ELgoub
fuente
esta respuesta es un duplicado de stackoverflow.com/a/2376135/6948900
Mikhail Antonov
-3

Utilizar

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

descomprimir una carpeta en Linux

Mohit Singh
fuente
Esto solo descomprimirá un solo archivo. La pregunta es descomprimir todas las carpetas
Vivek Panday
Para ser justos, el título "Descomprimir todos los archivos en un directorio" podría ser ambiguo y también significa "Descomprimir un solo archivo en un directorio separado".
jdersen