Descomprimir un lote de archivos

33

Cuando lo intento

 unzip filename.zip

funciona. Sin embargo, necesito descomprimir una serie de archivos zip.

Por qué son:

 find . -name "*.zip" -print0 | xargs -0 unzip

o

 ls *.zip | xargs unzip

¿no funciona?

En ambos casos aparece el mensaje "precaución: nombre de archivo no coincidente:".

jeannoburto
fuente

Respuestas:

48

Puedes emitir el comando:

$ unzip '*.zip'

Mira aquí para referencia .

vfbsilva
fuente
No lo dije claramente, pero no todos están en el mismo directorio. Entonces, necesito la salida de find.
jeannoburto
44
Gracias. Esto podría coincidir perfectamente con la pregunta real, pero esto resolvió mi problema. Estaba intentando unzip *y regresó caution: filename not matchedpara cada archivo pero unzip '*.zip'hizo el trabajo.
Ivan
27

Sus comandos no funcionan porque llenan todos los archivos en la misma línea de comandos. Si bien eso funciona con la mayoría de los programas, unziptomará el primer argumento como el archivo zip, y cualquiera después del primero como archivos para extraer de él. Debe ejecutar el comando una vez para cada archivo:

find . -name "*.zip" -print0 | xargs -0 -n1 unzip

O

find . -name '*.zip' -exec unzip {} \;
Kevin
fuente
El segundo parece ser mejor en caso de que realmente haya muchos archivos. (De lo contrario, se quejó de que el comando es demasiado largo con xargs)
Recct
5

En bash también puedes hacer lo siguiente:

for i in *.zip; do
    unzip "$i"
done

También unzippuede tomar el -dinterruptor para que pueda dirigir la salida a diferentes ubicaciones.

Por ejemplo:

uzdir=/path/to/unzips
for i in *.zip; do
    [ -d "$uzdir/$i" ] || mkdir -p "$uzdir/$i"
    unzip "$i" -d "$uzdir/$i"
done
slm
fuente
1

Hay una solución mucho más fácil que las de bucle dadas anteriormente, use el -dindicador de directorio :

unzip -o somefiles.zip -d $directoryPath
Aditya Mittal
fuente
-despecifica el directorio para extraer, no el directorio para buscar archivos.
LegendaryDude