spezifische Erweiterung entpacken nur
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.
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!