Pregunta

Tengo un un directorio con archivos zip que contienen .jpg, .png, .gif imágenes. Quiero descomprima cada archivo comprimido de tomar las imágenes solamente y ponerlos en una carpeta con el nombre del archivo.

Así que:

files/archive1.zip
files/archive2.zip
files/archive3.zip
files/archive4.zip

Abrir archive1.zip - tomar sunflower.jpg, rose_sun.gif. Hacer una carpeta de archivos / archive1 / y añadir las imágenes a esa carpeta, por lo que los archivos / archive1 / folder1.jpg, archivos / archive1 / rose_sun.gif. Para ello, a cada archivo.

Realmente no sé cómo se puede hacer esto, todas las sugerencias son bienvenidas. Tengo más de 600 archivos y una solución automática gustaría ser un salvavidas, preferiblemente una solución de Linux.

¿Fue útil?

Solución

Algo a lo largo de las líneas de:

#!/bin/bash
cd ~/basedir/files
for file in *.zip ; do
    newfile=$(echo "${file}" | sed -e 's/^files.//' -e 's/.zip$//')
    echo ":${newfile}:"
    mkdir tmp
    rm -rf "${newfile}"
    mkdir "${newfile}"
    cp "${newfile}.zip" tmp
    cd tmp
    unzip "${newfile}.zip"
    find . -name '*.jpg' -exec cp {} "../${newfile}" ';'
    find . -name '*.gif' -exec cp {} "../${newfile}" ';'
    cd ..
    rm -rf tmp
done

Esto se prueba y se encargará de espacios en los nombres de archivo (tanto los archivos zip y los archivos extraídos). Es posible que tenga colisiones si el archivo zip tiene el mismo nombre de archivo en diferentes directorios (no se puede evitar esto si va a aplanar la estructura de directorios).

Otros consejos

En Corto

Puede hacer esto con una sola línea encontrará + descomprimir.

find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;

en detalle

unzip le permite especificar los archivos que desea:

unzip archive.zip "*.jpg" "*.png" "*.gif"

Y -d un directorio de destino:

unzip -d images/ archive.zip "*.jpg" "*.png" "*.gif"

Combine eso con un find, y se puede extraer todas las imágenes de todas las cremalleras:

find . -name "*.zip" -type f -exec unzip -d images/ {} "*.jpg" "*.png" "*.gif" \;

El uso de unzip -j tirar a la basura la extracción de la estructura de directorio interno de la cremallera, podemos hacerlo todo en un solo comando. Esto le da la lista de imágenes planas separadas por nombre zip que usted desee como una sola línea.

find . -name "*.zip" -type f -exec unzip -jd "images/{}" "{}" "*.jpg" "*.png" "*.gif" \;

Una limitación es que unzip -d no creará más de un nuevo nivel de directorios, por lo que sólo mkdir images primero. Disfrutar.

7zip puede hacer esto, y tiene un Linux versión .

mkdir files/archive1
7z e -ofiles/archive1/ files/archive1.zip *.jpg *.png *.gif

(Sólo probado, funciona.)

Puede escribir un programa usando una biblioteca postal. Si lo hace Mono, puede utilizar DotNetZip .

El código se vería así:

foreach (var archive in listOfZips)
{
    using (var zip = ZipFile.Read(archive)
    {
        foreach (ZipEntry e in zip)
        {
            if (IsImageFile(e.FileName))
            {
                e.FileName = System.IO.Path.Combine(archive.Replace(".zip",""), 
                                  System.IO.Path.GetFileName(e.FileName));
                e.Extract("files");
            }
        }
    }
}

Archivo-Zip es un buen biblioteca para comprimir / descomprimir.

Esta es mi opinión sobre la primera respuesta ...

#!/bin/bash
cd files
for zip_name in *.zip ; do
    dir_name=$(echo "${zip_name}" | sed -e 's/^files.//' -e 's/.zip$//')
    mkdir ${dir_name}
    7z e -o${dir_name}/ ${zip_name} *.jpg *.png *.gif
done

o, si lo que desea es utilizar el comando regular de descomprimir ...

unzip -d ${dir_name}/ ${zip_name} *.jpg *.png *.gif

No he probado esto, pero debería funcionar ... o algo en este sentido. Sin duda, más eficiente que la primera solución. :)

Espero que esto ayude!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top