.Gz फ़ाइल एक्सटेंशन के बिना gzip फ़ाइल कैसे बनाएं?


14

मैं एक gzipped file बनाना चाहूंगा जो मूल फ़ाइल नाम को बरकरार रखे। उदाहरण के लिए, "example.txt" को gzipping को "example.txt.zz" के बजाय "example.txt" नामक एक gzipped फ़ाइल को आउटपुट करना चाहिए। क्या एक आदेश (बाद में नहीं करना mv) के साथ यह शान से करना संभव है ?


4
मैं थोड़ा उत्सुक हूं। आप ऐसा क्यों चाहते हैं? यह एक बुरे विचार की तरह लगता है।
बर्नहार्ड

3
हाँ। आप बैश स्क्रिप्ट में 2 पूरी लाइनें डालते हैं और इसे "माय-एलिगेंट-कमांड" कहते हैं। ;)
गोल्डिलक्स

2
@ बर्नहार्ड यह एक वेब ऐप के लिए एक सतत एकीकरण निर्माण प्रक्रिया का हिस्सा है। स्टैटिक एसेट्स (CSS, JS फाइलें) को फाइल का नाम बदले बिना कंप्रेस करने की जरूरत है। जब ब्राउज़र को "सामग्री-एन्कोडिंग: gzip" शीर्षक दिया जाता है, तो एक्सटेंशन अप्रासंगिक है। लेकिन अगर फ़ाइल नाम बदला जाता है, तो मुझे स्रोत HTML फ़ाइलों में एक खोज-और-जगह करना होगा।
जेमीब

यदि यह वास्तव में आपके लिए बहुत अधिक समस्या है, तो आप एक bash फ़ंक्शन को परिभाषित कर सकते हैं जो $ * से gzip निष्पादन योग्य हो जाता है और दूसरी पंक्ति आपके लिए mv करती है।
ब्राचली

4
@ आपकी वेब ऐप समस्या: कोई भी सभ्य वेबसर्वर आपके लिए कम्प्रेसिंग कर सकता है / कर सकता है ...
बनंगुइन

जवाबों:


12

यह काम नहीं करता:

# echo Hello World > example.txt
# gzip < example.txt > example.txt # WRONG!
# file example.txt
example.txt: gzip compressed data, from Unix, last modified: Thu Mar 21 19:45:29 2013
# gunzip < example.txt
<empty file>

यह एक दौड़ की स्थिति है:

# echo Hello World > example.txt
# dd if=example.txt | gzip | dd of=example.txt # still WRONG!
# gunzip < example.txt 
Hello World # may also be empty

समस्या यह है कि > example.txt(या dd of=example.txtउस मामले के लिए) फ़ाइल को मारता है इससे पहले कि अन्य प्रक्रिया को पढ़ने का मौका मिले। तो कोई स्पष्ट समाधान नहीं है, यही वजह है कि आपको छड़ी करनी चाहिए mv

ऐसे कई तरीके हैं जिनसे आप धोखा खा सकते हैं। आप फ़ाइल को खोल सकते हैं, फिर इसे अनलिंक कर सकते हैं - जब तक आप इसे बंद नहीं करेंगे तब तक फ़ाइल मौजूद रहेगी - और फिर उसी नाम से एक नई फ़ाइल बनाएं और उस पर gzipped डेटा लिखें। हालाँकि, मुझे इसका उपयोग करने के लिए बैश करने के लिए एक स्पष्ट तरीका नहीं पता है, और अगर मैंने किया भी, तो मेरा जवाब अभी भी होगा:

यह भी मत करो।

यदि gzipकिसी कारण से विफल हो जाता है, या कोई समस्या होती है, जैसे कि आप gzipping करते समय अंतरिक्ष से बाहर निकलते हैं (क्योंकि अन्य प्रक्रियाएं लिख रही हैं, या gzip परिणाम इनपुट से बड़ा है - जो यादृच्छिक डेटा के लिए होता है - आदि), तो आपने अपनी फ़ाइल खो दी है। । बधाई हो!

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


1
कैसे पूर्णता के लिए जोड़ने के बारे में:gzip example.txt && mv example.txt.gz example.txt
19

2
कोई depquid ओपी पढ़ें - यह है कि असजीला
गोल्डीलॉक्स

@goldilocks "एक अलग फ़ाइल बनाएं और mvसफलता पर।" और अधिक सुंदर बनाया जा सकता है? मैं बस यह प्रस्तावित करने की कोशिश कर रहा था कि फ्रॉस्ट्सचुट्ज़ का उत्तर एक विशिष्ट उदाहरण के साथ संवर्धित किया जाए। अगर mvमेरे विचार से अधिक सुरुचिपूर्ण ढंग से इस्तेमाल किया जा सकता है, तो कृपया एक उदाहरण दें।
21:39 पर मार्कीड

आपका सुझाव सरल, सुरुचिपूर्ण, स्पष्ट दृष्टिकोण है, लेकिन क्या यह काम करता है इतने सारे चर पर निर्भर करता है, उदाहरण के लिए पहले से ही एक उदाहरण है। साथ ही साथ काम करने के लिए कोई एक्सटेंशन नहीं है, आपको किसी भी तरह पहले से ही gzipped फ़ाइलों को gzipping को रोकना होगा। यह एक नया कीड़ा है, लेकिन यह वास्तव में सवाल का हिस्सा नहीं था।
फ्रॉस्ट्सचुट्ज़

10

मेरे पास एक ही मुद्दा था, एक एडब्ल्यूएस एस 3 में तैनात सीआई के हिस्से के रूप में।

यह वही है जो मैंने .gzप्रत्यय के बिना निर्देशिका (जगह में) को पुन: प्राप्त करने के लिए किया था :

find . -type f -exec gzip "{}" \; -exec mv "{}.gz" "{}" \;

मेरे लिए काफी साफ लगता है। लेकिन हाँ लगता है कि आपको mvवहाँ कहीं ज़रूरत है।

यदि आप उपयोग कर रहे हैं तो आप gruntदेख सकते हैं grunt-contrib-compressgruntविशेष रूप से S3 पर तैनाती के लिए कुछ उपकरण आपके लिए भी gzip को संभालेंगे।


1
कृपया स्थान को find . -type ...नहीं find.जोड़ा जाना चाहिए :)
हमिंगर

2

-S विस्तार आप चाहते हैं

gzip -S "`_date +%Y_%M' dog.txt 

dog.txt_2015_11 में परिणाम होगा

जब आप इसे अनज़िप कर लेते हैं, तो आपको एक्सटेंशन को निर्दिष्ट करना होगा।

gzip -d _2015_11 dog.txt_2015_11

यूनिक्स में फ़ाइल कमांड का उपयोग यह निर्धारित करने के लिए कि आपके पास किस प्रकार की फ़ाइल है, एक्सटेंशन भ्रामक हैं, या अक्सर गायब हैं।


1

मुझे नहीं लगता कि बिना किसी एक्सटेंशन के gzip फाइल बनाना वास्तव में उचित काम है।

IMHo .gz फ़ाइल को पढ़ने के लिए आपको अपने वेब सर्वर को कॉन्फ़िगर करना चाहिए। आप शायद पहले से ही इस तरह एक नियम है:

Path asets/:
  If header Accept-Encoding contains "gzip" and not contains "gzip;q=0":
    Add header Content-Encoding: gzip

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


1

इसके लिए आप s3_website आज़मा सकते हैं ।

मुझे यह पसंद नहीं है कि यह स्कैला और रूबी दोनों में लिखा गया है और इसे जेवीएम की जरूरत है। इसके अलावा, मुझे यह धारणा पसंद नहीं है कि यह (विशेष रूप से तथ्य यह है कि यह बाल्टी से अतिरिक्त फ़ाइलों को हटाता है) लेकिन यह काम करना चाहिए अगर आप इससे ठीक हैं।

मैं अपने दम पर ऐसा टूल लिखने की योजना बना रहा हूं जिसमें ये सीमाएँ नहीं हैं, देखते रहें।


0

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

यदि आप किसी भी प्रत्यय का उपयोग नहीं करना चाहते हैं, तो GNU आपके लिए अच्छा नहीं है, क्योंकि gzip -S ""यह एक वापसी होगी gzip: invalid suffix ''

हालाँकि, आप हमेशा कुछ gzip -S " "(रिक्त स्थान) भेज सकते हैं , और इसे इस तरह दिखाया जाएगा:

$ file testfile\  
testfile: gzip compressed data, was "testfile", from Unix, last modified: Tue Jun  3 XX:XX:XX 2014

बाद में, यदि आप इसे विघटित करना चाहते हैं, तो आपको कुछ ऐसा करना होगा gunzip -c testfile\ ( जैसे कि प्रत्यय को निर्दिष्ट किए बिना), या यहां तक ​​कि -fझंडे के साथ भी ।

मैं ईमानदारी से लगता है कि एक mvआदेश जोड़ने के साथ &&अपने कोड के लिए परेशानी का इतना नहीं होगा। वैसे भी, और जैसा कि @frostschutz ने कहा है, ऐसा करना वास्तव में अच्छा विचार नहीं है।


यह एक ऐसी चीज है जिसकी आवश्यकता है यदि आप संपीड़ित फ़ाइलों की सेवा के लिए S3 का उपयोग करना चाहते हैं, जैसे कि एक स्थैतिक वेबसाइट की मेजबानी के लिए। : आप इस पर विचार हो सकता github.com/laurilehmijoki/s3_website
क्रिस्टियन Măgheruşan-Stanciu
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.