ऑरिजनल फाइल रखने के लिए gzip कैसे बताएं?


210

मैं मूल फ़ाइल को रखते हुए gzip कमांड लाइन टूल का उपयोग करके एक टेक्स्ट फ़ाइल को संक्षिप्त करना चाहूंगा । डिफ़ॉल्ट रूप से निम्न कमांड चला रहा है

gzip file.txt

इस फ़ाइल को संशोधित करने और नाम बदलने में परिणाम file.txt.gz। इस व्यवहार के बजाय मैं मौजूदा के अलावा इस नई संपीड़ित फ़ाइल को रखना चाहूंगा file.txt। अभी के लिए मैं निम्नलिखित कमांड का उपयोग कर रहा हूं

gzip -c file.txt > file.txt.gz

यह काम करता है लेकिन मैं सोच रहा हूं कि इस तरह के सामान्य कार्य करने के लिए कोई आसान उपाय क्यों नहीं है? हो सकता है कि मैं ऐसा करने से चूक गया हो?


3
ऐसा इसलिए है, क्योंकि gzip दी गई फ़ाइल को संपीड़ित करता है और नई फ़ाइल बनाता है। संपीड़न का अर्थ है मूल फ़ाइल को निचोड़ना और इसे नए के साथ बदलना। आपका "-सी" विकल्प स्पष्ट रूप से दूसरे नाम के साथ इसे बचाने के लिए gzip बता रहा है। इसलिए यह काम करता है
SHW

@SHW मुझे आपकी टिप्पणी नहीं मिली ...?
मैनुएल सेल्वा

@ManuelSelva एक बार मूल फ़ाइल संपीड़ित होने के बाद, अब इसकी आवश्यकता नहीं है, मुझे लगता है कि यह डिजाइन था।
daisy

2
जब कोई अन्य यूनिक्स टूल ऐसा नहीं करता है तो gzip / gunzip डिफ़ॉल्ट रूप से ऐसा क्यों करता है।
मतीन उलहाक

जवाबों:


247

जीएनयू gzip1.6 या इसके बाद के संस्करण, FreeBSD और डेरिवेटिव या NetBSD के हाल के संस्करणों के लिए, don_cristi का जवाब देखें

किसी भी संस्करण के साथ, आप शेल पुनर्निर्देशन का उपयोग इस प्रकार कर सकते हैं:

gzip < file > file.gz

जब कोई तर्क नहीं दिया जाता है, तो gzipइसका मानक इनपुट पढ़ता है, इसे संपीड़ित करता है और इसके मानक आउटपुट को संपीड़ित संस्करण लिखता है। एक बोनस के रूप में, शेल पुनर्निर्देशन का उपयोग करते समय, आपको कॉल की गई फ़ाइलों के बारे में चिंता करने की ज़रूरत नहीं है ( "--help"या "-"बाद वाला अभी भी एक समस्या है gzip -c --)।

एक और लाभ gzip -c file > file.gzयह है कि अगर fileखोला नहीं जा सकता है, तो कमांड खाली file.gz(या किसी मौजूदा को अधिलेखित file.gzकिए बिना) और gzipसभी पर चलने के बिना विफल हो जाएगी ।

gzip -kहालांकि इसकी तुलना में एक महत्वपूर्ण अंतर यह है कि इसमें fileमेटाडेटा (स्वामित्व, अनुमतियां, संशोधन समय, असम्पीडित फ़ाइल का नाम) की प्रतिलिपि बनाने का कोई प्रयास नहीं किया जाएगा file.gz

इसके अलावा अगर file.gzपहले से मौजूद है, तो यह चुपचाप इसे ओवरराइड करेगा जब तक कि आपने noclobberअपने शेल में विकल्प को चालू नहीं किया है ( set -o noclobberउदाहरण के लिए POSIX गोले में)।


4
अब यह ओपी के प्रश्न की बारीकियों को संबोधित करता है और सामान्य प्रश्न का उत्तर देता है कि "मूल फ़ाइल को कैसे रखें? से बहुत उपयोगी और अधिक उपयोगी -c
कोडेक्सैग

8
ध्यान दें कि <और> वास्तव में कमांड में टाइप किए जाने वाले हैं और फ़ाइल नाम के लिए प्लेसहोल्डर का प्रतिनिधित्व नहीं कर रहे हैं
गौरव गुप्ता

-kविकल्प क्या है ? इसे मैन पेजों में नहीं पाया जा सकता है, उदाहरण के लिए यह संस्करण यहाँ linux.die.net/man/1/gzip है । इसके अलावा, ऐसा लगता है कि gzip डिफ़ॉल्ट रूप से फ़ाइल के मेटाडेटा को कॉपी करता है।
flow2k

1
@ flow2k, यह don_cristi के उत्तर की कड़ी है।
स्टीफन चेज़लस

आह, मैं इसे अपने macos पर देखता हूं, लेकिन बहुत बुरा यह RHEL और न ही Ubuntu पर नहीं है। धन्यवाद।
192 पर flow2k

138

ध्यान दें कि हाल ही में (जून 2013) ने "एक्जिट (-k) विकल्प स्वीकार किया है, जो कि xz, lzip और bzip2 जैसे उपकरणों के साथ है। इस विकल्प के साथ, gzip अब कंप्रेस्ड या डिकम्प्रेसिंग" नाम की इनपुट फ़ाइलों को नहीं हटाता हैgzip-1.6

मैन पेज से अंश:

  -k --keep
         Keep (don't delete) input files during compression or decompression.

इसलिए, 1.6आप मूल फ़ाइल का उपयोग -kया --keepरख सकते हैं :

gzip -k -- "$file"

(कृपया ध्यान दें कि अगर यह काम नहीं करता $fileहै -(जो gzipअर्थ के रूप में व्याख्या stdin वास्तविक बुलाया फ़ाइल के बजाय -) है, जो मामले में, आप इसे करने के लिए बदलने के लिए ./-)

उस विकल्प को पहली बार FreeBSD कार्यान्वयन मेंgzip (2007 में FreeBSD 7.0 में) के साथ स्थिरता के लिए लागू किया गया था bzip2। यह NetBSD द्वारा gzipGNU के पुनर्लेखन पर आधारित है gzip-kविकल्प अंततः 2010 में NetBSD वापस करने के लिए इसे बनाया है


10
गीज़। RHEL6 केवल बेस में 1.3.12 ज़िप के साथ आता है ...
निकोलस टोले कॉटरेल

यह Mac / OS X पर काम करता है :) (जो कि BSD है)
paul

क्या अब कई मानक डिस्ट्रोस> = 1.6 का उपयोग नहीं कर रहे हैं? आश्चर्य है कि अगर उत्तर की आवश्यकता है
माइकलचिरिको

किसके लिए? मुझे लगता है कि gzip -k "फ़ाइल" ठीक काम करती है।
notilas


30

प्रलेखन से ऐसा लगता है कि फ़ाइल की एक प्रति बनाने का कोई विकल्प नहीं है।

आप एक शेल फ़ंक्शन को परिभाषित कर सकते हैं

gzipkeep() {
    if [ -f "$1" ] ; then
        gzip -c -- "$1" > "$1.gz"
    fi
}

और फिर

gzipkeep file.txt

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