سؤال

لدي دليل AA مع أرشيفات Zip التي تحتوي على .jpg، .png، .gif الصور. أريد فك ضغط كل أرشيف أخذ الصور فقط ووضعها في مجلد باسم الأرشيف.

وبالتالي:

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

Open Archive1.zip - خذ Sunflower.jpg، Rose_sun.gif. قم بإجراء ملفات مجلد / أرشيف 1 / وإضافة الصور إلى هذا المجلد، لذلك الملفات / الأرشيف 1 / folder1.jpg، الملفات / الأرشيف 1 / Rose_Sun.gif. القيام بذلك لكل أرشيف.

أنا حقا لا أعرف كيف يمكن القيام بذلك، كل الاقتراحات هي موضع ترحيب. لدي أكثر من 600 أرشيف وحل أوتوماتيكي سيكون المنقذ، ويفضل محلول Linux.

هل كانت مفيدة؟

المحلول

شيء على غرار:

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

يتم اختبار هذا وسيقوم بمعالجة المساحات في أسماء الملفات (ملفات ZIP والملفات المستخرجة). قد يكون لديك تصادمات إذا كان الملف المضغوط يحتوي على نفس اسم الملف في الدلائل المختلفة (لا يمكنك تجنب ذلك إذا كنت ستقوم بتسطير بنية الدليل).

نصائح أخرى

بالمختصر

يمكنك القيام بذلك مع العثور على بطانة واحدة + unzip.

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

بالتفصيل

unzip يتيح لك تحديد الملفات التي تريدها:

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

و -d دليل الهدف:

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

الجمع بين ذلك مع find, ، ويمكنك استخراج جميع الصور في جميع العمود الفقري:

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

استخدام unzip -j لالكمل في استخراج هيكل الدليل الداخلي ZIP، يمكننا أن نفعل كل شيء في أمر واحد. يمنحك هذا قائمة الصور المسطحة مفصولة باسم الرمز البريدي الذي تريده كإطار واحد.

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

القيود هو ذلك unzip -d لن تخلق أكثر من مستوى جديد من الدلائل، لذلك فقط mkdir images أول. استمتع.

7Zip. يمكن القيام بذلك، ولها نسخة لينكس.

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

(فقط اختبارها، يعمل.)

يمكنك كتابة برنامج باستخدام مكتبة ZIP. إذا قمت بعلم، يمكنك استخدام dotnetzip..

سيبدو الرمز هذا:

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

بيرل الأرشيف - الرمز هي مكتبة جيدة ل Zipping / Unzipping.

إليك تأخذ في أول إجابة ...

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

أو، إذا كنت ترغب فقط في استخدام أمر UNZIP العادي ...

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

لم أختبر هذا، لكن يجب أن تعمل ... أو أي شيء على طول هذه الخطوط. بالتأكيد أكثر كفاءة من الحل الأول. :)

أتمنى أن يساعدك هذا!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top