Question

J'ai un répertoire avec des archives zip contenant .jpg, .png, .gif images. Je veux décompressez chaque archive prenant les images seulement et les mettre dans un dossier avec le nom de l'archive.

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

Ouvrir archive1.zip - prendre sunflower.jpg, rose_sun.gif. Faire un dossier de fichiers / archive1 / et ajoutez les images à ce dossier, les fichiers / archive1 / folder1.jpg, fichiers / archive1 / rose_sun.gif. Pour ce faire, à chaque archive.

Je ne sais vraiment pas comment cela peut se faire, toutes les suggestions sont les bienvenues. J'ai plus de 600 archives et une solution automatique serait une bouée de sauvetage, de préférence une solution Linux.

Était-ce utile?

La solution

Quelque chose le long des lignes 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

Ceci est testé et gérer les espaces dans les noms de fichiers (à la fois les fichiers zip et les fichiers extraits). Vous pouvez avoir des collisions si le fichier zip a le même nom de fichier dans des répertoires différents (vous ne pouvez pas éviter cela si vous allez aplatir la structure de répertoire).

Autres conseils

En bref

Vous pouvez le faire avec trouver une doublure + Décompressez.

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

En détail

unzip vous permet de spécifier les fichiers que vous souhaitez:

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

Et -d un répertoire cible:

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

Combinez cela avec un find, et vous pouvez extraire toutes les images dans toutes les fermetures éclair:

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

Utilisation unzip -j Junk l'extraction de la structure de répertoire interne du zip, nous pouvons le faire en une seule commande. Cela vous donne la liste des images plates séparées par nom zip que vous désirez comme une doublure.

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

Une limitation est que unzip -d ne crée pas plus d'un nouveau niveau de répertoires, de sorte que mkdir images premier. Profitez.

7zip peut le faire, et a un version Linux .

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

(Juste testé, cela fonctionne.)

Vous pouvez écrire un programme en utilisant une bibliothèque zip. Si vous faites Mono, vous pouvez utiliser DotNetZip .

Le code ressemblerait à ceci:

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");
            }
        }
    }
}

Archive-Zip est un bon bibliothèque pour passer comme un éclair / dézipper.

Voici mon avis sur la première réponse ...

#!/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

ou, si vous souhaitez simplement utiliser la commande unzip régulière ...

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

Je ne l'ai pas testé, mais il devrait fonctionner ... ou quelque chose le long de ces lignes. Sans aucun doute plus efficace que la première solution. :)

Hope this helps!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top