Frage

Ich habe ein Verzeichnis mit Zip-Archiven enthalten, JPG, PNG, GIF-Bilder. Ich mag jedes Archiv entpacken, nur die Bilder zu nehmen und sie in einem Ordner mit dem Namen des Archivs setzen.

So:

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

Öffnen archive1.zip - nimm sunflower.jpg, rose_sun.gif. Machen Sie einen Ordner Dateien / archive1 / und fügen Sie die Bilder in diesem Ordner, so files / archive1 / folder1.jpg, files / archive1 / rose_sun.gif. Tun Sie dies auf jedes Archiv.

Ich weiß wirklich nicht, wie dies getan werden kann, alle Vorschläge sind willkommen. Ich habe über 600 Archive und eine automatische Lösung wäre lebensrettend, vorzugsweise eine Linux-Lösung sein.

War es hilfreich?

Lösung

Etwas entlang der Linien von:

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

Dies wird getestet und Leerzeichen in Dateinamen (sowohl die ZIP-Dateien und die extrahierten Dateien) handhaben. Sie können Kollisionen, wenn die ZIP-Datei die gleichen Dateinamen in verschiedenen Verzeichnissen hat (Sie dies nicht vermeiden können, wenn Sie die Verzeichnisstruktur zu glätten gehen).

Andere Tipps

Im Kurzen

Sie können dies mit einem Einzeiler finden + unzip.

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

Im Detail

unzip können Sie die Dateien angeben, die Sie wollen:

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

Und -d ein Zielverzeichnis:

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

Kombiniert man dies mit einem find, und Sie können alle Bilder in allen Reißverschluss extrahieren:

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

unzip -j Mit der Extraktion des Reißverschlusses interner Verzeichnisstruktur auf Junk, können wir sie alle in einem einzigen Befehl tun. Dies gibt Ihnen die einfache Liste Bild von Zip-Namen getrennt, die Sie als Einzeiler wünschen.

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

Eine Einschränkung ist, dass unzip -d nicht mehr als eine neue Ebene der Verzeichnisse erstellen, so zunächst nur mkdir images. Genießen Sie.

7zip können dies tun, und hat eine Linux-Version .

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

(Just getestet, es funktioniert.)

Sie können ein Programm mit einer Zip-Bibliothek schreiben. Wenn Sie Mono tun, können Sie DotNetZip .

Der Code würde wie folgt aussehen:

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

Perl Archive-Zip ist eine gute Bibliothek für zippen / Entzippen.

Hier ist mein nehmen auf der ersten Antwort ...

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

oder, wenn Sie möchte nur den regulären unzip Befehl verwenden ...

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

Ich habe nicht getestet, aber es sollte funktionieren ... oder etwas in diese Richtung. Auf jeden Fall effizienter als die erste Lösung. :)

Hope, das hilft!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top