Unzip امتداد محدد فقط
سؤال
لدي دليل 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
لم أختبر هذا، لكن يجب أن تعمل ... أو أي شيء على طول هذه الخطوط. بالتأكيد أكثر كفاءة من الحل الأول. :)
أتمنى أن يساعدك هذا!