Gzip kullanarak tüm bir klasörü fermuarlayabilir miyim?


407

Unix'te bir klasörü sıkıştırmaya çalışıyorum. Bu gzip komutu kullanılarak yapılabilir mi?


6
gzip -r myfolderhangi dosyaları ardışık olarak gzip ile kullanabilirsiniz . Aynı şekilde, gunzip -r myfolder dosyaları tekrar tekrar açacağınız şekilde kullanarak dosyaları da açabilirsiniz . Daha fazla bilgi için, man gzip
Valentin Bajrami

12
Kullanın tar; sıkıştırma seçeneklerini destekler. yedek olarak değil, gziptamamlayıcı olarak tasarlanmıştır tar.
devnull

13
@ Val0x00ff 'in önerisinin, başarmak istediğinizi kesinlikle kesinlikle almadığına dikkat edin.
Shadur

4
@Shadur bu yüzden onu gönderdim commentçünkü o zaman bu sorunun cevabı değildi.
Valentin Bajrami

2
@Shadur'un ne anlama geldiğini göstermek için. Verilen dosyalar 1ve 2klasörün altında playground. klasörün altında gzip -r ./playgroundsize 1.gzve 2.gz(ve daha fazla dosya 1ve 2dosya vermeyecek ) playground, içinde her şey bulunan sıkıştırılmış bir dosya DEĞİLDİR.
Jeff Xiao,

Yanıtlar:


660

Hayır.

Aksine zip, yalnızcagzip sıkıştırma algoritması olarak işlev görür .

Çünkü bazıları geri teyp sürücülerinin dönemin dinleyerek çeşitli nedenlerle Unix adlı bir program kullanır tarsonra böyle bir sıkıştırma programı ile sıkıştırılmış olabilir verileri arşivlemek, gzip, bzip2, 7zip, vb

Bir dizini "sıkıştırmak" için, doğru komut

tar -zcvf archive.tar.gz directory/ 

Bu söyleyecektir tariçin

  • z (gzip) algoritmasını kullanarak sıkıştır

  • c (create) içindeki dosyalardan bir arşiv directory( tarvarsayılan olarak özyinelemelidir)

  • v (sözlü olarak) arşive eklediği tüm dosyaları (on / dev / stderr açıktır, böylece boru komutlarını etkilemez) listeler.

  • ve çıktının adında bir f (dosya) olarak saklayın.archive.tar.gz

tarKomut sunmaktadır gzip(aracılığıyla destek -ztamamen size kolaylık sağlamak için bayrak). gzipKomut / lib tamamen ayrıdır. Yukarıdaki komut etkili bir şekilde aynıdır.

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

Arşivi açmak ve kullanmak için geçerli dizine açmak için

tar -zxvf archive.tar.gz

Bu komut etkili olarak aynıdır

gunzip < archive.tar.gz | tar -xv

tarMANY, diğer birçok seçeneğe ve kullanım alanına sahiptir; Bir ara onun sayfasını okumanızı şiddetle tavsiye ediyorum.


51
Sadece işleri daha da açık bir hale getirmek için, bu tamamen eşdeğerdir tar -cv directory | gzip > archive.tar.gz. Sonuçta ortaya çıkan arşiv daha sonra tar -zxvfveya ile çıkarılabilir zcat file.tar.gz | tar -xv. Katranın gzip'ten tamamen bağımsız olduğuna dikkat edin, tarkomut sadece kolaylık sağlamak için gzip desteğini içerir.
Patrick

i kullanıyoruz tar cvzfuzunca bir süre. Unutulmaması gereken bir şey: 7-zipbir *.tar.gzdosyayı açmak için Windows kullanıyorsanız ( belirtilecek) , iki tur alır. Bir *.tar.gzdosyayı bir *.tardosyaya açmak, bir diğeri bu tar dosyasını orijinal içeriğe açmak. özellikle büyük dosyalar için toplam açılma süresini arttırır (örneğin, kayıtlar)
Jeff Xiao

1
Arşivin isimlendirilmesi makineyle ilgili herhangi bir şeyi etkiler mi? İnsanların başlangıçta sıkıştırmak için kullanılan algoritmayı (dolayısıyla .gz) bilmelerine izin vermenin hoş olacağını biliyorum, ama bunun dışında arşivi nasıl adlandırdığınızın önemi var mı?
hello_there_andy

3
@hello_there_andy Çoğu unix için farketmez, ancak pencereler (ve linux'da akıllı sekme tamamlama) dosya adı uzantısına dayalı varsayımlarda bulunur.
Shadur

1
@vadimkotov Aradığın şey olabilir: superuser.com/questions/168749/…
Shadur

47

gzipKullanırken komut yinelemeli tek bir zip dosyası içine bir dizin sıkıştırmak olmaz -ranahtarı. Aksine, bu dizin yapısını yürüyecek ve bulduğu her dosyayı ayrı bir dosyaya yerleştirecektir.

Örnek

önce

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

şimdi gzipkomutu çalıştır

$ gzip -r dir1

sonra

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

Dizin yapısını tarsıkıştırmayı tercih ederseniz, muhtemelen komutu kullanmak ve sonuçta ortaya çıkan .tardosyayı sıkıştırmak isteyeceksiniz .

$ tar zcvf dir1.tar.gz dir1/

Örnek

$ 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

Aşağıdaki tek dosyada sonuçlanan:

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

İçeriğini onaylayabilirsiniz:

$ 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

Bu 2 komutu yazdım:

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

(!!!) Lütfen kullanmadan önce test edin (nadiren kullanılırsa önemli verileri potansiyel olarak kaldırabilecek bir 'rm -f' olduğundan).

Nasıl kullanılır:

cd /home/; gzipdir MyDirectory veya gzipdir /home/MyDirectory

/Home/MyDirectory.tgz oluşturacak ve MyDirectory'i başarı ile kaldıracak (!!!).

ungzipdir /home/MyDirectory.tgz

/ Home / MyDirectory oluşturacak ve /home/MyDirectory.tgz dosyasını başarıyla kaldıracak.


Bir dizindeki TÜM dosyaları sıkıştırmak için: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (find komutuna dikkat edin, önce sınayın -exec echo {}ve PARENT dizinini sıkıştıracak, muhtemelen tüm ana dizini kıracak olan './' dosyasını almadığınızdan emin olun)
andrew lorien

1

Tavsiye ederim pigz( GZip'in Paralel Uygulanması )

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


Ben de çok kullanıyorum (ve pixz), fakat borular ve çıkış yönlendirmeleri devreye girdiğinde çalışıyor mu?
Michael Wolf

1

“Linux üzerinde zip kullanarak tüm bir klasörü sıkıştırabilir miyim?” Sorusunun yanıtı, sözdizimini kullanmaktır:

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

Yeni bir sorunuz varsa, lütfen Soru Sor düğmesine tıklayarak sorun . Bağlam sağlamaya yardımcı oluyorsa, bu soruya bir bağlantı ekleyin. - Şu kaynaktan
Jeff Schaller

2
@JeffSchaller: Bu bir cevap. Bu, kasten yanlış olan bir şey (inanıyorum), ama açıkça bir cevap.
Scott

1
@ize: Gönderdiğiniz komutun aslında gzip kullanmadığından eminim.
dhag

1
Sıkça sorulan sorular gibi zip kullanmaya dikkat edin, büyük olasılıkla yazar pencerelerde olduğu gibi aynı şeyi yapmanın mümkün olduğunu bilmek isterdi. Üzücüdür ki çoğu insan uzak düşünmek istemez.
Florian Heigl

2
Sorunun ne zaman ... ... "gzip" kullandığını belirtmesi çok zordur.
Jeff Schaller

1

Tamamlanmak için, dosyayı arka planda tarmak istiyorsanız, @ Shadur'un cevabını kullanın ve sonuna ekleyin &:

tar -zcvf archive.tar.gz directory/ &

0

Linux katranınız -zseçeneği desteklemiyorsa , aşağıdakileri kullanabilirsiniz:

tar -cvf - dir | gzip > dir.tar.gz
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.