क्या मैं gzip का उपयोग करके संपूर्ण फ़ोल्डर को ज़िप कर सकता हूं?


407

मैं यूनिक्स में एक फ़ोल्डर ज़िप करने की कोशिश कर रहा हूँ। क्या यह gzip कमांड का उपयोग करके किया जा सकता है?


6
आप उपयोग कर सकते हैं gzip -r myfolderजो फ़ाइलों को पुनरावर्ती रूप से gzip करेगा। उसी तरह से आप फ़ाइलों को अनज़िप कर सकते हैं gunzip -r myfolder जिनका उपयोग करके फ़िर से फ़ाइलों को अनज़िप किया जाएगा। अधिक जानकारी के लिए, man gzip
वैलेंटाइन बजरमी

12
का उपयोग करें tar; यह संपीड़न के विकल्पों का समर्थन करता है। gzipएक पूरक के रूप में डिज़ाइन किया गया है tar, न कि प्रतिस्थापन के रूप में।
देवनुल

13
ध्यान दें कि @ val0x00ff का सुझाव लगभग निश्चित रूप से वह नहीं है जिसे आप पूरा करना चाहते हैं।
शादुर

4
@ बहादुर इसीलिए मैंने इसे पोस्ट किया commentक्योंकि यह उसके सवाल का जवाब नहीं था।
वैलेंटाइन बजरमी

2
@Shadur का क्या अर्थ है, इसे नष्ट करने के लिए। फ़ाइलों 1और 2फ़ोल्डर के अंतर्गत दिया गया playgroundgzip -r ./playgroundआपको 1.gzऔर 2.gz(और नहीं 1और 2फ़ाइलों को) फ़ोल्डर के तहत देगा playground, इसमें सब कुछ के साथ ज़िपित फ़ाइल नहीं।
जेफ जिओ

जवाबों:


660

नहीं।

इसके विपरीत zip, केवलgzip एक संपीड़न एल्गोरिथ्म के रूप में कार्य करता है ।

क्योंकि विभिन्न कारणों जिनमें से कुछ वापस टेप ड्राइव के युग की ओर कान लगाता की, यूनिक्स नामक एक कार्यक्रम का उपयोग करता है tarडेटा संग्रह करने के लिए है, तो एक संपीड़न प्रोग्राम की तरह के साथ संकुचित किया जा सकता है gzip, bzip2, 7zip, आदि

एक निर्देशिका को "ज़िप" करने के लिए, सही कमांड होगा

tar -zcvf archive.tar.gz directory/ 

यह बता देंगे tarकरने के लिए

  • z (gzip) एल्गोरिथ्म का उपयोग करके इसे संपीड़ित करें

  • (फ़ाइलों में से एक संग्रह बनाएँ) directory( tarडिफ़ॉल्ट रूप से पुनरावर्ती है)

  • v (वर्बोसली) सूची (/ dev / stderr पर ताकि यह पाइप्ड कमांड्स को प्रभावित न करे) यह सभी फाइल को आर्काइव में जोड़ता है।

  • और आउटपुट को f (फ़ाइल) नाम से स्टोर करेंarchive.tar.gz

tarआदेश प्रदान करता है gzip(के माध्यम से समर्थन -zविशुद्ध रूप से आपकी सुविधा के लिए झंडा)। gzipआदेश / lib पूरी तरह अलग है। उपरोक्त आदेश प्रभावी रूप से उसी के समान है

tar -cv directory | gzip > archive.tar.gz

वर्तमान निर्देशिका में आपके द्वारा उपयोग किए जाने वाले संग्रह को विघटित और अनपैक करने के लिए

tar -zxvf archive.tar.gz

यह आदेश प्रभावी रूप से उसी के समान है

gunzip < archive.tar.gz | tar -xv

tarकई, कई, कई अन्य विकल्प हैं और साथ ही उपयोग करता है; मैं कभी-कभी इसके मैनपेज के माध्यम से दिल से पढ़ने की सलाह देता हूं।


51
बस चीजों को और अधिक स्पष्ट करने के लिए, यह बिल्कुल समान है tar -cv directory | gzip > archive.tar.gz। परिणामस्वरूप संग्रह को तब tar -zxvfया उसके साथ भी निकाला जा सकता है zcat file.tar.gz | tar -xv। यह इंगित किया जा रहा है कि टार पूरी तरह से gzip से स्वतंत्र है, tarकमांड में सुविधा के लिए gzip समर्थन शामिल है।
पैट्रिक

मैं tar cvzfकाफी समय से उपयोग कर रहा हूं । एक बात ध्यान दें: यदि आप 7-zipकिसी *.tar.gzफ़ाइल को अनज़िप करने के लिए विंडोज ( निर्दिष्ट किए जाने के लिए) का उपयोग करते हैं, तो दो राउंड लगते हैं। एक *.tar.gzफ़ाइल में फ़ाइल को अनज़िप करने के लिए *.tar, दूसरा उस मूल सामग्री में टार फ़ाइल को अनज़िप करने के लिए। यह विशेष रूप से बड़ी फ़ाइलों (जैसे लॉग्स) के लिए कुल unzipping समय को बढ़ाता है
जेफ जिओ

1
क्या संग्रह का नामकरण किसी मशीन-वार को प्रभावित करता है? मुझे पता है कि लोगों को यह बताना अच्छा होगा कि एल्गोरिथ्म मूल रूप से इसे ज़िप करने के लिए इस्तेमाल किया जाता है (इसलिए .gz), लेकिन इसके अलावा क्या यह वास्तव में मायने रखता है कि आप आर्काइव का नाम कैसे दें?
हेल्लो_थेरे_ंडी 15

3
@hello_there_andy यह अधिकांश यूनिक्स के लिए कोई फर्क नहीं पड़ता है, लेकिन विंडोज़ (और लिनक्स में स्मार्ट टैब पूरा करना) फ़ाइल नाम एक्सटेंशन के आधार पर धारणाएं बनाता है।
शादुर 16

1
@vadimkotov यह वही हो सकता है जिसे आप ढूंढ रहे हैं: superuser.com/questions/168749/…
Shadur

47

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

उदाहरण

इससे पहले

$ tree dir1/
dir1/
|-- dir11
|   |-- file11
|   |-- file12
|   `-- file13
|-- file1
|-- file2
`-- file3

अब gzipकमांड चलाएं

$ gzip -r dir1

उपरांत

$ tree dir1/
dir1/
|-- dir11
|   |-- file11.gz
|   |-- file12.gz
|   `-- file13.gz
|-- file1.gz
|-- file2.gz
`-- file3.gz

यदि आप निर्देशिका संरचना को ज़िप करना चाहते हैं, तो आप संभवतः tarकमांड का उपयोग करना चाहेंगे , और फिर परिणामी .tarफ़ाइल को संक्षिप्त करें ।

$ tar zcvf dir1.tar.gz dir1/

उदाहरण

$ tar zcvf dir1.tar.gz dir1/
dir1/
dir1/file1
dir1/file2
dir1/dir11/
dir1/dir11/file11.gz
dir1/dir11/file12.gz
dir1/dir11/file13.gz
dir1/file3

निम्नलिखित सिंगल फाइल में कौन सा परिणाम है:

$ ls -l | grep tar
-rw-rw-r-- 1 saml saml  271 Oct  1 08:07 dir1.tar.gz

आप इसकी सामग्री की पुष्टि कर सकते हैं:

$ tar ztvf dir1.tar.gz 
drwxrwxr-x saml/saml         0 2013-10-01 08:05 dir1/
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file1
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file2
drwxrwxr-x saml/saml         0 2013-10-01 08:04 dir1/dir11/
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file11.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file12.gz
-rw-rw-r-- saml/saml        27 2013-10-01 07:45 dir1/dir11/file13.gz
-rw-rw-r-- saml/saml         0 2013-10-01 07:45 dir1/file3

4

मैंने इन 2 कमांडों को स्क्रिप्ट किया है:

gzipdir:

#!/bin/bash
if [[ -d $1 ]]; then
    cd "$1"
    cd ..
    base=$(basename "$1")
    tar -zcvf "$base.tgz" "$base"
    if [[ $? == 0 && -f "$base.tgz" ]]; then
        rm -rf "$base"
    fi
else
    echo "Usage: $0 DIRECTORY";
fi

ungzipdir:

#!/bin/bash
if [[ -f $1 ]]; then
    base=${1%%.*}
    file=$(basename "$1");
    dir=$(basename "$base");
    if [[ ! -d $base ]]; then
        mkdir "$base"
        cd "$base"
        cd ..
        tar -xvf "$file"
        if [[ $? == 0 && -d "$dir" ]]; then
            rm -f "$file"
        fi
    else
        echo "Directory $base already exists. Nothing done."
    fi
else
    echo "Usage: $0 file.tgz";
fi

(!!!) कृपया उपयोग करने से पहले परीक्षण करें (क्योंकि वहाँ एक 'आरएम-एफ' है जो संभावित रूप से महत्वपूर्ण डेटा को हटा सकता है यदि इसका उपयोग असामान्य तरीके से किया जाता है)।

कैसे इस्तेमाल करे:

cd /home/; gzipdir MyDirectory या gzipdir /home/MyDirectory

/Home/MyDirectory.tgz बनाएगा और सफलता पर MyDirectory (!!!) को हटा देगा।

ungzipdir /home/MyDirectory.tgz

/ होम / MyDirectory बनाएंगे और सफलता पर /home/MyDirectory.tgz को हटाएंगे।


किसी निर्देशिका में सभी फ़ाइलों को ज़िप करने के लिए: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (खोज कमांड के साथ सावधान रहें, इसे -exec echo {}पहले परीक्षण करें, और सुनिश्चित करें कि कैप्चरिंग नहीं है '/।' जो PARENT निर्देशिका को ज़िप करेगा, संभवतः आपके पूरे घर को तोड़ना)
andrew lorien

1

मैं उपयोग करने की सलाह देता हूं pigz( GZip के समानांतर कार्यान्वयन )

tar -cvf - dir | pigz -9 > /path/to/dir.tar.gz


मैं इसे बहुत अधिक (और पिक्सज़) का उपयोग करता हूं, लेकिन क्या यह तब काम करता है जब पाइप और आउटपुट पुनर्निर्देशन खेलने में आते हैं?
माइकल वुल्फ

1

प्रश्न का उत्तर "क्या मैं लिनक्स पर जिप का उपयोग करके एक संपूर्ण फ़ोल्डर को ज़िप कर सकता हूं?" सिंटैक्स का उपयोग करना है:

zip -r <zip file name> <folder to zip>

यदि आपके पास कोई नया प्रश्न है, तो कृपया प्रश्न पूछें बटन पर क्लिक करके इसे पूछें । इस प्रश्न का लिंक शामिल करें यदि यह संदर्भ प्रदान करने में मदद करता है। - समीक्षा से
जेफ़ स्कॉलर

2
@JeffSchaller: यह एक उत्तर है। यह एक गलत गलत है (मुझे विश्वास है), लेकिन यह स्पष्ट रूप से एक जवाब है।
स्कॉट

1
@ize: मुझे पूरा यकीन है कि आपके द्वारा पोस्ट किया गया आदेश वास्तव में, gzip का उपयोग नहीं करेगा।
ढिग

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

2
यह मुश्किल है जब सवाल निर्दिष्ट करता है ... "gzip का उपयोग"।
जेफ स्कालर

1

पूर्णता के लिए, यदि आप बैकग्राउंड में फाइल को टारगेट करना चाहते हैं, तो &अंत में @ शादुर के उत्तर और एपेंड का उपयोग करें :

tar -zcvf archive.tar.gz directory/ &

0

यदि आपका linux टार -zविकल्प का समर्थन नहीं करता है तो आप निम्नलिखित का उपयोग कर सकते हैं:

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