एक तारकोल के मामले में वर्तमान निर्देशिका को प्रदूषित किए बिना सुरक्षित रूप से कैसे अनारक्षित करें?


33

सम्मानजनक परियोजनाओं, टार संग्रहों है कि एक ही निर्देशिका शामिल रिलीज उदाहरण के लिए zyrgus-3.18.tar.gzएक शामिल zyrgus-3.18फ़ोल्डर जो बारी में शामिल src, build, dist, आदि

लेकिन कुछ पंक प्रोजेक्ट्स ने सबकुछ जड़ में डाल दिया: '- (यह अनआर्काइविंग करते समय कुल गड़बड़ी का परिणाम है । हर बार मैन्युअल रूप से एक फ़ोल्डर बनाना एक दर्द है, और अधिकांश समय अनावश्यक है।

  • क्या यह बताने के लिए एक सुपर-फास्ट तरीका है कि क्या .tar या .tar.gz फ़ाइल में एक रूट पर एक से अधिक निर्देशिका है? एक बड़े संग्रह के लिए भी।
  • या इससे भी बेहतर, क्या कोई उपकरण है जो ऐसे मामलों में एक निर्देशिका (एक्सटेंशन के बिना संग्रह का नाम) बनाएगा और अंदर सब कुछ डाल देगा?


2
मुझे लगता है कि पैकेज लेखक को एक बग रिपोर्ट के लायक टूटी हुई पैकेजिंग।

14
मैंने ऐतिहासिक रूप से (90 के दशक के मध्य से) हमेशा एक उपनिर्देशिका में अनट्रेड किया। यदि इसकी सभी को एक ही निर्देशिका में रखा जाता है (जैसा कि यह होना चाहिए), तो इसकी सामग्री को mv के साथ सही स्थान पर ले जाया जा सकता है, फिर आप अति-अतिरिक्त अतिरिक्त निर्देशिका को हटा सकते हैं। दो अतिरिक्त कदम हाँ, लेकिन यह गलत तरीके से बनाई गई टार फ़ाइल से गंदगी को साफ करता है।
TED

6
But some punk projects put everything at the root :'-(और कुछ पंक प्रोजेक्ट्स ने एक फ़ोल्डर के अंदर सब कुछ पूरी तरह से अनावश्यक रूप से डाल दिया, यह देखते हुए कि वे पहले से ही सब कुछ एक एन्कोडिंग संग्रह के अंदर डाल रहे हैं, ताकि जब आप इसे डाउनलोड करें और इसे अपने स्वयं के फ़ोल्डर में अनज़िप करें जैसे कि कोई भी स्मार्ट उपयोगकर्ता करेगा, तो आप सभी को समाप्त कर देते हैं सामग्री ने दूसरी परत को नीचे दबा दिया। ;-)
मेसन व्हीलर

2
@MasonWheeler टार अभिलेखागार के अंदर एक फ़ोल्डर में सब कुछ करने के लिए "डी-फैक्टो मानक" का एक प्रकार है।
9

जवाबों:


30

patool विभिन्न प्रकार के अभिलेखागार को संभालता है और संग्रह के निकाले गए निर्देशिका के साथ कार्यशील निर्देशिका को अव्यवस्थित करने से रोकने के लिए संग्रह में कई फाइलें होती हैं।

संग्रह निकालें

patool extract archive.tar

समर्थित प्रारूपों की एक सूची प्राप्त करने के लिए, का उपयोग करें patool formats


FYI करें: इसे sourceforge.net/projects/patool पर मिला । यह एक आरपीएम है और मैं alienइसे उबंटू के लिए एक डिबेट में परिवर्तित करता था।
जो '

patoolयदि आप वर्तमान संस्करण चला रहे हैं तो डेबियन और उबंटू के लिए रिपॉजिट में होना चाहिए।
मार्को

12

आप कुछ ऐसा कर सकते थे

tar tf thefile.tar | cut -d/ -f1 | sort -u

यह देखने के लिए कि टार-स्तरीय प्रविष्टियों में टार क्या है; wc -lएक से अधिक होने की जाँच करने के लिए पाइप । ध्यान दें कि कुछ मामले हैं जहां यह विफल हो जाएगा, उदाहरण के लिए अगर टार में फॉर्म के फ़ाइल पथ somedir/whateverऔर ./somedir/whatever(या कुछ क्रैज़ियर) भी हैं; हालांकि यह असामान्य होना चाहिए।

यह कुछ भी आउटपुट करने से पहले पूरी टार फाइल को पढ़ेगा, क्योंकि sort, यह वास्तव में निकालने की तुलना में तेज़ होना चाहिए क्योंकि यह सिर्फ एक अनुक्रमिक रीड है और यह बड़ी फ़ाइलों को छोड़ सकता है।

आप इस सहभागी कर रहे हैं और फ़ाइल बड़े हो सकता है, तो आप बदल सकते हैं sort -uकरने के लिए uniqऔर Control+ Cकी तुलना में अधिक एक बात करता है, तो इसे बाहर प्रिंट करता है।


2
sort | uniqको छोटा किया जा सकता है sort -u
मार्को

4
जब तक आप क्या करना चाहते हैंuniq -c
कैस

7

तुम कर सकते हो:

pax <some.tar

... किसी tarफ़ाइल की सामग्री को सूचीबद्ध करने के लिए ।

यदि आप यह जानना चाहते हैं कि यह कितने स्तरों तक जाता है, तो आप कर सकते हैं:

pax <some.tar | tr -dc /\\n | sort -r | head -n1

आप स्पष्ट रूप से निष्कर्षण पर विस्फोट से मना कर सकते हैं:

mkdir some.tar
pax -'rs|^|some.tar/|' <some.tar

2

यह वही करना चाहिए जो आप चाहते हैं। मुझे यकीन है कि कोई इसे सुधार सकता है। इन उदाहरणों में मुझे लगता है कि यह एक gzip संपीड़ित टार संग्रह है क्योंकि यह सबसे आम है।

आप एक संग्रह चाहते हैं जहाँ रूट स्तर निर्देशिका ट्री में कोई सिबलिंग नोड्स नहीं हैं।

टार सामग्री सूची में प्रत्येक प्रविष्टि एक ही पैटर्न से शुरू होनी चाहिए। यह पैटर्न आधार निर्देशिका पथ है जिसे संग्रह में सभी प्रविष्टियों को साझा करना होगा। यदि कोई भी दो प्रविष्टियाँ एक ही पैटर्न से शुरू नहीं होती हैं तो वे भाई बहन हैं।

टार सामग्री सूची में पहली पंक्ति आपको न्यूनतम पैटर्न देगी जिसकी आपको जांच करने की आवश्यकता है। यह बासपेटा है।

BASEPATH=$(tar ztf example.tar.gz | (read line; echo $line))

फिर विस्फोटक टारबॉल के लिए परीक्षण करने के लिए आपको यह जांचने की आवश्यकता है कि क्या टार कंटेंट सूची की कोई भी लाइन BASEPATH से शुरू नहीं होती है।

tar ztf example.tar.gz | grep -qv "^${BASEPATH}"

इसे शेल फ़ंक्शन में बदलें:

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

यहां से आप एक सुरक्षित टार संग्रह निष्कर्षण फ़ंक्शन लिख सकते हैं।

is_explosive() {
    TARBALL_NAME=$1
    tar ztf "${TARBALL_NAME}" | grep -qv "^$(tar ztf "${TARBALL_NAME}" | (read line; echo ${line}))"
    return $?
}

safe_tar_x() {
    TARBALL_NAME=$1
    if is_explosive ${TARBALL_NAME}; then
        SUBDIR=${TARBALL_NAME%.tar.gz}
        SUBDIR=${SUBDIR##*/}
        mkdir "${SUBDIR}"
        echo "WARNING: This tarball is explosive. Opening in subdirectory, ${SUBDIR}, for safety." >&2
    else
        SUBDIR="."
    fi
    # Tar quirks: "--directory" must be last, and using more than
    #     one option group requires that all groups start with a dash.
    tar -zxf "${TARBALL_NAME}" --directory "${SUBDIR}"
    return $?
}

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