2011-06-02 11 views
11

Tengo un directorio lleno de archivos zip. Cada uno llamó algo así como 'files1.zip'. Mi instinto es usar un bash for loop para descomprimir cada archivo.¿Cómo puedo usar un solo comando para descomprimir todos los archivos en un directorio, en un nuevo directorio único con el mismo nombre que el archivo

Problema es que muchos de los archivos descomprimirán sus contenidos directamente en el directorio padre, en lugar de desplegar todo en su propio directorio exclusivo. Entonces, obtengo sopa de archivos.

Me gustaría asegurarme de que 'files1.zip' vierta todos sus archivos en un directorio llamado 'files1', y así sucesivamente.

Como complicación adicional, algunos de los nombres de archivo tienen espacios.

¿Cómo puedo hacer esto?

Gracias.

+0

relacionadas: [http://stackoverflow.com/q/2463874/435605](http://stackoverflow.com/q/2463874/435605) –

Respuesta

14
for f in *.zip; do 
    dir=${f%.zip} 

    unzip -d "./$dir" "./$f" 
done 
0

puede usar -d para descomprimir en un directorio diferente.

for file in `echo *.zip`; do 
    [[ $file =~ ^(.*)\.zip$ ]] 
    unzip -d ${BASH_REMATCH[1]} $file 
done 
+0

'echo * .zip' no funcionará para los nombres de archivos zip que contienen espacios. – Neil

+4

¿Por qué no simplemente 'para el archivo en * .zip; hacer ... hecho'? –

1

simple chiste

$ for file in `ls *.zip`; do unzip $file -d `echo $file | cut -d . -f 1`; done 
Cuestiones relacionadas