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.

Respuestas:


395

Esto funciona en bash, de acuerdo con este enlace :

descomprimir \ *. zip


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"

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

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 {} \;

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?


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.


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.


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

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

2

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


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)


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

-2
for i in `ls *.zip`; do unzip $i; done

14
Uso peligroso de ls. ¿Qué pasa si tiene un archivo llamado "-j -o -d .. jackass.zip"
geocar


-3

Utilizar

sudo apt-get install unzip 

unzip file.zip -d path_to_destination_folder

descomprimir una carpeta en Linux


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
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.