2010-11-29 6 views
5

मेरे उन फ़ाइलों को ज़िप करने दिया जाएगा जो इस तरह दिखेगा:खोल दो ज़िप फ़ाइल और निकालने अज्ञात फ़ोल्डर नाम की सामग्री

TEMPLATE1.ZIP 
    |--------- UnknownName 
        |------- index.html 
        |------- images 
           |------- image1.jpg 

मैं इस प्रकार यह ज़िप फ़ाइल निकालना चाहते हैं:

/mysite/user_uploaded_templates/myrandomname/index.html 
/mysite/user_uploaded_templates/myrandomname/images/image1.jpg 

मेरे समस्या अज्ञात नाम के साथ है - मुझे नहीं पता कि यह पहले से क्या है और "आधार" स्तर पर सबकुछ निकालने से index.html

मैं इस ज़िप फ़ाइल से कैसे निकाला जा सकता हूं ई सामग्री अज्ञात नाम के?

1. Extract everything 
2. Detect which "new subdidrectory" got created 
3. mv newsubdir/* . 
4. rmdir newsubdir/ 

अगर वहाँ UnknownName स्तर में एक से अधिक उप-निर्देशिका है, मुझे लगता है कि उपयोगकर्ता के ज़िप फ़ाइल अस्वीकार कर सकते हैं:

वहाँ कुछ भी से बेहतर है।

उत्तर

6

मुझे लगता है कि अपने दृष्टिकोण एक अच्छा एक है। चरण 2 को एक नई बनाई गई निर्देशिका (बाद में हटाया गया) में निकालने में सुधार किया जा सकता है ताकि "पहचान" तुच्छ हो।

# Bash (minimally tested) 
tempdest=$(mktemp -d) 
unzip -d "$tempdest" TEMPLATE1.ZIP 
dir=("$tempdest"/*) 
if ((${#dir[@]} == 1)) && [[ -d $dir ]] 
    # in Bash, etc., scalar $var is the same as ${var[0]} 
    mv "$dir"/* /mysite/user_uploaded_templates/myrandomname 
else 
    echo "rejected" 
fi 
rm -rf "$tempdest" 
+0

'dir = (" $ tempdest "/ *)' की तलाश में – Sisyphus

0

अन्य विकल्प जो मैंने सुझाया है उसके अलावा अन्य unzip -j ध्वज का उपयोग करना है जो सभी पथों को डंप करेगा और सभी फ़ाइलों को वर्तमान निर्देशिका में रखेगा। यह बिल्कुल साफ समाधान नहीं है

destdir=/mysite/user_uploaded_templates/myrandomname 
unzip -j -d "$destdir" 
mkdir "${destdir}/images" 
mv "${destdir}/*.jpg" "${destdir}/images" 

लेकिन कम से कम आप किसी भी पार्स करने के लिए की जरूरत नहीं है: क्या आप निश्चित रूप से कह यदि आपका TEMPLATE1.ZIP फ़ाइलों में से प्रत्येक के एक index.html और *.jpg फ़ाइलों तो आप की तरह कुछ कर सकते हैं शामिल है कि जैसे आप अपने उदाहरण में करते हैं। मुझे patch -p# जैसा कोई भी विकल्प नहीं दिख रहा है जो आपको पथ स्तर निर्दिष्ट करने देता है।

0

प्रत्येक zip और unzip आदेश अलग है, लेकिन वहाँ आमतौर पर फ़ाइल की सामग्री को सूचीबद्ध करने का तरीका है। वहां से, आप अज्ञात निर्देशिका नाम निर्धारित करने के लिए आउटपुट पार्स कर सकते हैं।

विंडोज़ पर, 1996 वेल्स/सुखपूर्वक/वैन दर लिंडन/रोमेल संस्करण यह unzip -l है।

बेशक, आप केवल अनजिप फ़ाइलों को जो भी निर्देशिका चाहते हैं उसे अनजिप करने की अनुमति दे सकते हैं, फिर mv का उपयोग निर्देशिका के नाम के अनुसार करें जिसे आप चाहते हैं।

$tempDir = temp.$$ 
mv $zipFile temp.$$ 
cd $tempDir 
unzip $zipFile 
$unknownDir = * #Should be the only directory here 
mv $unknownDir $whereItShouldBe 
cd .. 
rm -rf $tempDir 

यह हमेशा आप अंत इस आदेश के दो उदाहरणों चल मामले में संचालन के इन प्रकार के लिए एक अस्थायी निर्देशिका बनाने के लिए एक अच्छा विचार है।

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