जब मैं इसे निकालता हूं तो मैं अनजिप / जिप को कैसे बाध्य नहीं कर सकता?


19

एक ज़िप फ़ाइल कैसे बनाई जाती है, इसके आधार पर, कभी-कभी यह सभी फ़ाइलों को सीधे निकाल देगा, और कभी-कभी यह फ़ाइलों को एक उपनिर्देशिका में निकालेगा।

यदि उत्तरार्द्ध सत्य है, तो मैं unzipकमांड को पहले स्तर की निर्देशिका को "अनदेखा" करने के लिए कैसे मजबूर कर सकता हूं ?

उदाहरण:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
mkdir omeka
unzip omeka-1.5.1.zip -d omeka/
cd omeka/
ll

मुझे जो मिल रहा है वह है /tmp/omeka/omeka-1.5.1/:

total 12
drwxr-xr-x 3 root root 4096 2012-05-08 18:44 ./
drwxrwxrwt 6 root root 4096 2012-05-08 18:44 ../
drwxr-xr-x 5 root root 4096 2012-04-20 14:54 omeka-1.5.1/

मैं जो चाहता हूं, वह फ़ाइलों को निकाला जाता है /tmp/omeka/, (एक स्तर ऊपर और निर्देशिका संरचना में कोई संस्करण संख्या शामिल नहीं है)

/tmp/omeka/(files)

मुझे पता है कि मैं -j"जंक पाथ" के विकल्प का उपयोग कर सकता हूं लेकिन मैं उपनिर्देशिका संरचना रखना चाहता हूं, न कि केवल शीर्ष स्तर की निर्देशिका संरचना। मैं यह कैसे कर सकता हूँ?


ps: मुझे पता है कि मैं और फिर mvफ़ाइलों को निकाल सकता हूं , लेकिन मैं यह देखना चाहता था कि क्या यह अनजिप कमांड से सीधे करने का कोई तरीका है
cwd

मुझे एक की जानकारी नहीं है। लेकिन अगर फ़ाइलनाम हमेशा निर्देशिका नाम से (विस्तार के अलावा) मेल खाता है, तो यह निकाले गए डायर का नाम बदलने के लिए बहुत सीधा है।
चटाई

3
मैं देखता हूं कि आप क्या करने की कोशिश कर रहे हैं, लेकिन मैं इसकी सिफारिश नहीं करूंगा। अपने प्रोजेक्ट स्रोतों से संस्करण संख्या को अलग करना एक बुरा विचार है; यदि आप संस्करण जानकारी के बिना छोटा नाम चाहते हैं तो आपको बस सामान्य रूप से अर्क निकालना चाहिए और एक ln -s का उपयोग करना चाहिए। इस तरह आप हमेशा जानते हैं कि आप किस संस्करण को चला रहे हैं और लिंक को स्विच करके आसानी से एक नए संस्करण में अपडेट कर सकते हैं।
बर्टन समोग्राड

@BurtonSamograd - यह आदर्श होगा, लेकिन मैं अभी भी उत्सुक हूं अगर ऐसा करने का कोई प्रभावी तरीका है क्योंकि कुछ सॉफ़्टवेयर, Wordpress को एक उदाहरण के रूप में लेते हैं, हर संस्करण /wordpress/को ज़िप फ़ाइल के अंदर एक निर्देशिका (कोई संस्करण संख्या) के अंदर नहीं डालते हैं । यह वास्तव में ठीक है unzipऔर फिर mvइस पर कोई नियंत्रण नहीं है और इसे दो चरणों में करने से हमेशा मेरी नसों पर थोड़ा असर पड़ता है। सौभाग्य से Wordpress भी एक .tar.gzस्वाद में आता है :)
cwd

कोशिश करेंcd /tmp/omeka && ln -s -T . omeka-1.5.1
जेम्स यंगमैन

जवाबों:


4

एक FUSE फाइल सिस्टम का उपयोग करें जो आपको निर्देशिका जैसे AVFS जैसे अभिलेखागार ब्राउज़ करने की अनुमति देता है । cpफ़ाइलों को अपनी पसंद की निर्देशिका में निकालने के लिए उपयोग करें ।

mountavfs
cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/omeka-1.5.1 omeka

चूंकि हम यह मान रहे हैं कि संग्रह में एकल टॉपवेल निर्देशिका है, इसलिए आप इसे छोटा कर सकते हैं

cp -Rp ~/.avfs/tmp/omeka-1.5.1.zip\#/* omeka

@ आप विशेषज्ञ हैं जो आते हैं और उन सभी सवालों के जवाब देते हैं जो कोई और नहीं दे सकता है, इसलिए मुझे लगता है कि यह वास्तव में ऐसा करने का एकमात्र तरीका है। मुझे उम्मीद unzipथी कि ऐसा करने के लिए कुछ जादू होगा, जैसे कि फ़ाइलों को निकालने के लिए निर्दिष्ट करना, जैसे */*कि मैं एक और उपयोगिता स्थापित किए बिना उपयोग कर सकता हूं, लेकिन मुझे लगता है कि नहीं। धन्यवाद। +1
cwd

6

यदि आपकी ज़िप फ़ाइल में कोई निर्देशिका संरचना नहीं है या आपको इसे संरक्षित करने की आवश्यकता नहीं है, तो आप इसका उपयोग कर सकते हैं:

cd /tmp
wget http://omeka.org/files/omeka-1.5.1.zip
unzip -j omeka-1.5.1.zip -d omeka
cd omeka
ll

3

यह स्क्रिप्ट मजबूत नहीं है, लेकिन सरल मामलों में काम करती है:

...
dest=omeka
unzip omeka-1.5.1.zip -d $dest/

if [ `ls $dest | wc -l` == 1 ]; then
  subdir=`ls $dest`
  mv $dest/$subdir/* $dest/
  rmdir $dest/$subdir
fi

यह सिर्फ यह देखने के लिए जांचता है कि क्या वास्तव में एक उपनिर्देशिका है, और यदि ऐसा है, तो सब कुछ ऊपर ले जाता है, फिर इसे हटा देता है।


2

मैंने आज ही पंजीकरण करवाया है, इसलिए मैं @SteveBennet उत्तर नहीं दे सकता और वहां कोई टिप्पणी नहीं जोड़ सकता।

उनके जवाब के आधार पर मैंने इस तरह एक पुनरावर्ती कार्य बनाया:

...

shopt -s dotglob # To include hidden files in the move command

function moveSub {
  local dest=$1
  if [ `ls $dest | wc -l` == 1 ]; then
    local subdir=`ls $dest`
    moveSub "$dest/$subdir"
    mv $dest/$subdir/* $dest/
    rmdir $dest/$subdir
  fi
}

moveSub "$dest"

जैसे @SteveBennet ने कहा: यह स्क्रिप्ट मजबूत नहीं है, लेकिन सरल मामलों में काम करती है।

आशा है कि यह उपयोगी है।


1

patch --strip=nविकल्प की तरह लगता है

यह patch --strip=number(या -pnumber) की तरह एक विकल्प के लिए वांछनीय होगा जो numberशुरुआत में पथ घटकों को काटता है (रेफरी। कंपेयरिंग और मर्जिंग फाइल्स: विशेष विवरण )।

अन्य समाधान, प्रयोज्यता

असफल होना, एक और समाधान है, हैकिश का लेकिन काम करता है। मेरे मामले में, मैं पहले ज़िप को हटाए बिना, ज़िप की सामग्री के साथ मौजूदा फ़ाइलों से भरी निर्देशिका को अधिलेखित करना चाहता था।

जब यह समाधान काम करता है और @ गिल्स का समाधान उपलब्ध होता है, तो बाद वाला भी काम करेगा। फिर भी इस समाधान को FUSE फाइल सिस्टम की उपलब्धता की आवश्यकता नहीं है।

यह कैसे करना है

मान लें कि आप अतिरिक्त निर्देशिका जानते हैं omeka-1.5.1, तो आप ऐसा कर सकते हैं:

mkdir omeka
ln -s . omeka/omeka-1.5.1 # create a symlink that redirects output
unzip omeka-1.5.1.zip -d omeka/
rm omeka/omeka-1.5.1 # remote symlink

unzipकरने के लिए omeka-1.5.1जो वास्तव में dir युक्त एक सहिष्णु है unzip करने की कोशिश करेंगे । नतीजतन, फाइलें omekaसीधे जमीन में आ जाएंगी ।

संभव प्रकार

आप एक चित्रण पदानुक्रम के एक या अधिक भागों को पुनर्निर्देशित करने के लिए वेरिएंट की कल्पना कर सकते हैं।

ln -s ../myfoo omeka/omeka-1.5.1/foo
ln -s ../../mybarxyzzy omeka/omeka-1.5.1/subdir/bar

निष्कर्ष

यह समाधान कुछ हद तक विशिष्ट है, फिर भी इसके उपयोग के मामले हैं और मैं अभी इसका उपयोग करने के लिए हुआ हूं।


महान समाधान यदि आप रास्ता जानते हैं!
grepsedawk

पहले, जैसे ज़िप सामग्री को सूचीबद्ध करके पथ की जांच की जा सकती है unzip -l। यह एक स्क्रिप्ट का उपयोग करके भी स्वचालित किया जा सकता है जो उस पथ का हिस्सा है जो आम है।
स्टीफन गौरिचोन

ओह पूरी तरह से, यह सिर्फ एक टन आसान है यदि आप मार्ग जानते हैं। मैंने थोड़े-थोड़े समय के लिए अनज़िप-एल के साथ खेला लेकिन यह थोड़ा अधिक grep / sed / awk था जैसा मैंने इरादा किया था इसलिए मैंने इसे वापस कर दिया।
13

zipinfo -1एक अच्छी शुरुआत हो सकती है। आपका उपयोग मामला क्या है?
स्टीफन गौरीचोन 12

github.com/grepsedawk/wow-config/blob/… इस मामले में, मुझे निर्देशिका पता है :)
grepsedawk

1

सबसे अधिक संभावना है कि आप विकल्प के unzipसाथ चलना चाहते हैं -j, जैसे:

unzip -j files.zip -d ./output/

लेकिन आप इसके व्यवहार से हैरान हो सकते हैं:

-जे कबाड़ रास्ते। संग्रह की निर्देशिका संरचना को फिर से बनाया नहीं गया है; सभी फाइलें निष्कर्षण निर्देशिका (डिफ़ॉल्ट रूप से, वर्तमान एक) में जमा की जाती हैं।

यदि आप files.zipआउटपुट डायरेक्टरी में एक्सट्रैक्ट करते हैं ./outputऔर आपको इसका परिणाम मिलता है:

./output/files/subfolder1/f1
./output/files/subfolder1/f2

तब -jविकल्प आपको यह देगा (सभी पथ धारीदार):

./output/f1
./output/f2
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.