2009-05-26 18 views
5

मेरे पास .jpg, .png, .gif छवियों वाले ज़िप अभिलेखागार वाली निर्देशिका है। मैं प्रत्येक संग्रह को केवल छवियों को लेने और संग्रह के नाम से फ़ोल्डर में डालने के लिए अनजिप करना चाहता हूं।विशिष्ट एक्सटेंशन को अनजिप करें केवल

तो:

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

ओपन archive1.zip - sunflower.jpg rose_sun.gif लेते हैं,। फ़ोल्डर फ़ोल्डर/संग्रह 1/और छवियों को उस फ़ोल्डर में जोड़ें, इसलिए फ़ाइलें/संग्रह 1/folder1.jpg, फ़ाइलें/संग्रह 1/rose_sun.gif। प्रत्येक संग्रह में यह करो।

मुझे सच में नहीं पता कि यह कैसे किया जा सकता है, सभी सुझावों का स्वागत है। मेरे पास 600 से अधिक अभिलेखागार हैं और एक स्वचालित समाधान एक लाइफसेवर होगा, अधिमानतः एक लिनक्स समाधान।

उत्तर

1

की तर्ज पर कुछ । यदि आपके पास ज़िप निर्देशिका में अलग-अलग निर्देशिकाओं में एक ही फ़ाइल नाम है तो आप टकराव कर सकते हैं (यदि आप निर्देशिका संरचना को फ़्लैट करने जा रहे हैं तो आप इससे बच नहीं सकते हैं)।

+0

यह एक उत्कृष्ट समाधान होगा, सिवाय इसके कि अस्थायी निर्देशिका आईओ और सिस्टम संसाधनों को बर्बाद कर देती है। आपको अनजिप कॉल में वाइल्डकार्ड जोड़ना चाहिए। ('* .jpg' '* .png' '* .gif' को अंत में जोड़ें।) इसके अलावा, आपको ज़िप फ़ाइल की प्रतिलिपि बनाने से बचना चाहिए, और इसके बजाय "unzip ../${newfile}/zip" का उपयोग करें। – MiffTheFox

+0

मुझे विश्वास नहीं है कि दक्षता का स्तर यहां एक वास्तविक चिंता है, यह मेरे लिए एक शॉट ऑपरेशन जैसा दिखता है (या वह जो अक्सर ओवर-इंजीनियरिंग वारंट करने के लिए पर्याप्त नहीं किया जाएगा)। अंत परिणाम वह है जो ओपी चाहता था, संग्रह नाम के आधार पर एक विशिष्ट निर्देशिका में ग्राफ़िक फ़ाइलें। – paxdiablo

+0

हाँ, यह एक बार की बात होगी :), मुझे लगता है कि मैं अभी इन सभी समाधानों का परीक्षण कर रहा हूं, स्थानीय रूप से, सर्वर पर – vache

4

7zip ऐसा कर सकता है, और Linux version है।

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

(बस इसे परीक्षण किया है, यह काम करता है।)

+0

मुझे अभी कोशिश – vache

+0

tx लेकिन से मैं प्रत्येक ज़िप के लिए इस चलाना होगा मैं थोड़ी देर के छोरों, या कुछ जोड़ सकते हैं करते हैं? – vache

1

आप एक ज़िप लाइब्रेरी का उपयोग कर एक कार्यक्रम लिख सकते हैं। यदि आप मोनो करते हैं, तो आप DotNetZip का उपयोग कर सकते हैं।

कोड इस तरह दिखेगा:

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

यह परीक्षण किया जाता है और फ़ाइल नाम में रिक्त स्थान (दोनों ज़िप फ़ाइलें और निकाले फ़ाइलें) संभाल लेंगे:

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

अच्छी तरह से मैं इसे लिनक्स पर रखना चाहता हूं, इसलिए अधिमानतः नहीं .net, लेकिन मुझे ऐसा करने में सक्षम होना चाहिए, एक जावा ज़िप लाइब्रेरी नंबर का उपयोग करने से कहें? – vache

+0

क्षमा करें, मुझे नहीं पता कि जावा ज़िप पुस्तकालयों में समान कार्य है या नहीं। मेरा मतलब है, मुझे यकीन है कि आप इसे कर सकते हैं, यह प्रोग्रामिंग का एक साधारण मामला है। लेकिन सवाल यह है कि प्रोग्रामिंग कितनी है। जब आप ऐ "मैं इसे लिनक्स पर रखना चाहता हूं, तो अधिमानतः .NET नहीं" - क्या आप जानते हैं कि मोनो लिनक्स पर चलता है? दूसरे शब्दों में, आप लिनक्स पर सी # और .NET का उपयोग कर सकते हैं। – Cheeso

1

पर्ल की Archive-Zip ज़िप/अनजिपिंग के लिए एक अच्छी लाइब्रेरी है।

0

यहाँ पहले जवाब पर मेरी ले है ...

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

मैं परीक्षण नहीं किया यह, लेकिन यह काम करना चाहिए ... या इन पंक्तियों के साथ कुछ। पहले समाधान की तुलना में निश्चित रूप से अधिक कुशल। :)

उम्मीद है कि इससे मदद मिलती है!

4

लघु

में आप पा + unzip एक एक लाइनर के साथ ऐसा कर सकते हैं।

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

और -d लक्ष्य निर्देशिका:

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

कम्बाइन कि एकसाथ

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

विस्तार में

unzip आप फ़ाइलों को आप चाहते हैं निर्दिष्ट कर सकते हैं, और आप सभी ज़िप में सभी छवियों को निकालने कर सकते हैं:

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

जिप के आंतरिक निर्देशिका संरचना की निकासी जंक unzip -j का उपयोग करना, हम यह सब एक आदेश में कर सकते हैं। यह आपको ज़िप नाम से अलग फ्लैट छवि सूची देता है जिसे आप एक लाइनर के रूप में चाहते हैं।

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

एक सीमा यह है कि unzip -d निर्देशिका के एक से अधिक नए स्तर, तो बस mkdir images पहले नहीं पैदा करेगा है। का आनंद लें।

संबंधित मुद्दे