स्टड से निकालने पर टार ऑटो को कंप्रेशन टाइप का पता लगाने दें


16

मैं ग्नू टार का उपयोग करता हूं। यह संपीड़ित प्रकार का पता लगा सकता है जब फ़ाइलों को संपीड़ित / विघटित किया जाता है। लेकिन मुझे स्टड से एक संग्रह को विघटित करने की आवश्यकता है और संपीड़ित प्रकार अज्ञात है। मैंने देखा कि टार मुझे सही सुझाव दे सकता है जैसे:

tar: Archive is compressed. Use -z option

लेकिन मैं टार कि संपीड़न विकल्प का उपयोग करना चाहते हैं स्वचालित रूप से उस कथन की इनपुट करने के लिए मुझसे पूछे बिना। मैं उसे कैसे कर सकता हूँ? क्यों नहीं decompress बस क्योंकि यह पहले से ही संपीड़न प्रकार जानता है?

धन्यवाद!


इसमें विकास करना कठिन नहीं था, लेकिन अब तक ऐसा नहीं किया गया है।
पीटर -

3
ऐसा नहीं करने का कारण यह है कि tarयह नहीं जानता कि stdinयह पढ़ने के बाद तक किस प्रकार का डेटा है, और तब तक यह अनकम्प्रेस्ड प्रोग्राम को कॉल करने के लिए बहुत देर हो चुकी है। यह gzip, bzip2 और अन्य का समर्थन करता है। इस समस्या के आसपास काम करना आसान नहीं है (यह डेटा को बफर करना होगा), इसलिए यह आपको फिर से प्रयास करने के लिए कहता है।
केविन पेंको

@ केविनपैंको ऐसा क्यों है जहां बहुत देर हो चुकी है? नहीं, देर नहीं हुई है। वह बफर में पहले 4K को पढ़ता है, अपने संपीड़न प्रकार का परीक्षण करता है (यदि एक है), तो प्रोग्राम को कॉल करता है। यह बफ़रिंग अतिरिक्त C कोड की 10-20 पंक्तियाँ थीं।
पेटेर - मोनिका

2
उस समय में जब यह जानता है कि इसके पास कौन सा डेटा है, यह अब एक सरल fork()/ exec()विधि का उपयोग करके डेटा को एक असम्पीडित उपयोगिता के माध्यम से पाइप कर सकता है। उपयोगिता stdinपाइप से पढ़ी जाएगी और पहले 4K अब गायब हो जाएगा। इसे पढ़ने के बाद डेटा को पाइप में वापस डालने का कोई तरीका नहीं है।
केविन पेंको

3
@ केविनपैंको: यह दो प्रक्रियाओं को फोर्क करके किया जा सकता है, हालांकि, मूल रूप से इसके बराबर कर रहा है cat buffer - | gunzip। (वैकल्पिक रूप से, गैर-अवरुद्ध I / O का उपयोग अतिरिक्त प्रक्रिया की आवश्यकता से बचने के लिए किया जा सकता है।)
इल्मरी करोनें

जवाबों:


10

यह वह उत्तर नहीं है जिसे आप सुनना चाहते हैं, लेकिन यह GNU टार द्वारा इसके मैनुअल के अनुसार समर्थित नहीं है:

एकमात्र मामला जब आपको संग्रह पढ़ते समय एक विघटन विकल्प को निर्दिष्ट करना होता है, जब पाइप से या टेप ड्राइव से पढ़ना होता है जो यादृच्छिक पहुंच का समर्थन नहीं करता है। हालांकि, इस मामले में जीएनयू टार संकेत देगा कि आपको किस विकल्प का उपयोग करना चाहिए। उदाहरण के लिए:

$ cat archive.tar.gz | tar tf -
tar: Archive is compressed.  Use -z option
tar: Error is not recoverable: exiting now

यदि आप इस तरह के डायग्नोस्टिक्स देखते हैं, तो बस सुझाए गए विकल्प को GNU टार के आह्वान में जोड़ें:

$ cat archive.tar.gz | tar tzf -

- 8.1.1 कम्प्रेस्ड आर्काइव्स बनाना और पढ़ना


2
ध्यान दें कि यह OSX पर टार कमांड में काम करता है लेकिन GNU टार का उपयोग करके लिनक्स पर नहीं। इसलिए इसे ठीक किया जा सका
सीन पेरी

8

अंत में, मुझे इस बात का अहसास हुआ कि मैं टार का पता नहीं लगा सकता और स्टड से संग्रह को विघटित कर सकता हूं, यह है कि मैं GNU टार का उपयोग करता हूं। बीएसडी टार समस्या के बिना स्वचालित रूप से कर सकता है। इसलिए मैं अब अपनी स्क्रिप्ट में टार के बजाय bsdtar का उपयोग करने का निर्णय लेता हूं।

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