2011-09-24 20 views
7

क्या स्टडीन/स्टडआउट का उपयोग करके बैश में एक स्ट्रिंग को संपीड़ित/डिकंप्रेस करना संभव है?(अन/डी) बाश में एक स्ट्रिंग को संपीड़ित करें?

मैंने कोशिश की लेकिन स्पष्ट रूप से यह समर्थित नहीं है?

hey=$(echo "hello world" | gzip -cf) 
echo $hey # returns a compressed string 
echo $hey | gzip -cfd 
gzip: stdin is a multi-part gzip file -- not supported 

मुझे लिनक्स में अच्छी तरह से पता नहीं है लेकिन मैंने अन्य संपीड़न उपयोगिता मैन पेज पढ़े हैं और समाधान नहीं मिला?

उत्तर

5

जब आप ऐसा करेंगे:

hey=$(echo "hello world" | gzip -cf) 

आप चर hey में एक ही एक ही बाइट्स की जरूरत नहीं है के द्वारा बनाई गई के रूप में आप /tmp/myfile में है:

echo "hello world" | gzip -cf > /tmp/myfile 

आप gzip मिल ": stdin एक बहु है -part gzip फ़ाइल - समर्थित नहीं है "त्रुटि बस क्योंकि आपने संपीड़ित डेटा तोड़ दिया है जो असम्पीडित नहीं हो सकता है।

VAR=$(...) निर्माण टेक्स्ट के साथ काम करने के लिए डिज़ाइन किया गया है। यही कारण है कि आप उदाहरण के लिए अतिरिक्त पिछला ट्रिम प्राप्त करते हैं।

6

तो 33% संपीड़न दर नुकसान स्वीकार्य है आप के लिए है, तो आप बेस 64 इनकोडिंग संकुचित डाटा स्टोर कर सकते हैं:

me$mybox$ FOO=$(echo "Hello world" | gzip | base64) # compressed, base64 encoded data 
me$mybox$ echo $FOO | base64 -d | gunzip # use base64 decoded, uncompressed data 
Hello world 

यह काम करेंगे, लेकिन प्रत्येक 3 (संकुचित) बाइट्स पाठ के 4 बाइट में संग्रहीत किया जाएगा ।

+6

संपीड़न के दौरान 'base64' का उचित उपयोग' base64 -w0' होगा। अन्यथा, आउटपुट में न्यूलाइन जोड़े जाते हैं। – JohnEye

संबंधित मुद्दे