Bisakah saya zip seluruh folder menggunakan gzip?


407

Saya mencoba membuka folder zip di unix. Bisakah itu dilakukan dengan menggunakan perintah gzip?


6
Anda dapat menggunakan gzip -r myfolderfile gzip mana yang akan dilakukan secara rekursif. Cara yang sama Anda dapat membuka zip file gunzip -r myfolder yang akan membuka zip file secara rekursif. Untuk informasi lebih lanjut, man gzip
Valentin Bajrami

12
Gunakan tar; ini mendukung opsi untuk kompresi. gzipdirancang sebagai pelengkap tar, bukan sebagai pengganti.
devnull

13
Perhatikan bahwa saran @ val0x00ff hampir pasti bukan yang ingin Anda capai.
Shadur

4
@ Shadur itu sebabnya saya mempostingnya commentkarena itu bukan jawaban untuk pertanyaannya.
Valentin Bajrami

2
Untuk mendemostrasikan apa artinya @Shadur. File yang diberikan 1dan di 2bawah folder playground. gzip -r ./playgroundakan memberi Anda 1.gzdan 2.gz(dan tidak ada lagi 1dan 2file) di bawah folder playground, BUKAN file zip dengan segala yang ada di dalamnya.
Jeff Xiao

Jawaban:


660

Tidak.

Tidak seperti zip, gzipberfungsi sebagai algoritma kompresi hanya .

Karena berbagai alasan beberapa yang mendengarkan kembali ke era tape drive, Unix menggunakan sebuah program bernama taruntuk mengarsipkan data, yang kemudian dapat dikompresi dengan program kompresi seperti gzip, bzip2, 7zip, dll

Untuk "zip" direktori, perintah yang benar adalah

tar -zcvf archive.tar.gz directory/ 

Ini akan memberitahu tarke

  • kompres dengan menggunakan algoritma z (gzip)

  • c (buat) arsip dari file-file di directory( tarbersifat rekursif secara default)

  • v (secara verbal) daftar (di / dev / stderr sehingga tidak memengaruhi perintah pipa) semua file yang ditambahkan ke arsip.

  • dan menyimpan output sebagai nama f (file)archive.tar.gz

The tarperintah menawarkan gzipdukungan (melalui -zbendera) semata-mata untuk kenyamanan Anda. The gzipperintah / lib benar-benar terpisah. Perintah di atas secara efektif sama dengan

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

Untuk mendekompres dan membongkar arsip ke direktori saat ini yang akan Anda gunakan

tar -zxvf archive.tar.gz

Perintah itu secara efektif sama dengan

gunzip < archive.tar.gz | tar -xv

tarmemiliki banyak, banyak, BANYAK opsi dan penggunaan lainnya juga; Saya sungguh-sungguh merekomendasikan untuk membaca halaman manualnya kapan-kapan.


51
Hanya untuk membuat hal-hal menjadi lebih eksplisit, ini persis sama dengan tar -cv directory | gzip > archive.tar.gz. Arsip yang dihasilkan kemudian dapat diekstraksi dengan tar -zxvfatau bahkan zcat file.tar.gz | tar -xv. Intinya adalah bahwa tar sepenuhnya independen dari gzip, tarperintahnya hanya menyertakan dukungan gzip untuk kenyamanan.
Patrick

Saya telah menggunakan tar cvzfcukup lama. satu hal yang perlu diperhatikan: jika Anda menggunakan Windows ( 7-zipditentukan) untuk membuka ritsleting *.tar.gzfile, dibutuhkan dua putaran. Satu untuk unzip *.tar.gzfile menjadi *.tarfile, yang berikutnya untuk unzip file tar ke konten asli. itu meningkatkan waktu unzipping total, terutama untuk file besar (misalnya log)
Jeff Xiao

1
Apakah penamaan arsip memengaruhi sesuatu yang bijaksana secara mesin? Saya tahu akan lebih baik untuk memberi tahu orang-orang algoritma yang awalnya digunakan untuk zip itu (karenanya .gz), tetapi selain itu apakah itu benar-benar peduli bagaimana Anda memberi nama arsip?
hello_there_andy

3
@hello_there_andy Tidak ada bedanya dengan sebagian besar unix, tetapi windows (dan penyelesaian tab cerdas di linux) akan membuat asumsi berdasarkan ekstensi nama file.
Shadur

1
@vadimkotov Ini mungkin yang Anda cari: superuser.com/questions/168749/…
Shadur

47

The gzipPerintah tidak akan secara rekursif kompres direktori ke file zip tunggal, bila menggunakan -rswitch. Alih-alih itu akan berjalan struktur direktori dan zip setiap file yang ditemukannya ke file terpisah.

Contoh

sebelum

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

sekarang jalankan gzipperintah

$ gzip -r dir1

setelah

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

Jika Anda lebih suka untuk zip up struktur direktori maka Anda mungkin ingin menggunakan tarperintah, dan kemudian kompres .tarfile yang dihasilkan .

$ tar zcvf dir1.tar.gz dir1/

Contoh

$ 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

Yang menghasilkan file tunggal berikut:

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

Anda dapat mengkonfirmasi isinya:

$ 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

Saya menuliskan 2 perintah ini:

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

(!!!) Silakan uji sebelum digunakan (karena ada 'rm -f' yang berpotensi menghapus data penting jika digunakan dengan cara yang tidak umum).

Cara Penggunaan:

cd /home/; gzipdir MyDirectory atau gzipdir /home/MyDirectory

Akan membuat / home / MyDirectory.tgz dan menghapus MyDirectory jika berhasil (!!!).

ungzipdir /home/MyDirectory.tgz

Akan membuat / home / MyDirectory dan menghapus /home/MyDirectory.tgz jika berhasil.


Untuk mem-zip SEMUA file dalam direktori: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (hati-hati dengan perintah find, ujilah dengan yang -exec echo {}pertama, dan pastikan Anda tidak menangkap './' yang akan mem-zip direktori PARENT, mungkin merusak seluruh dir home)
andrew lorien

1

Saya sarankan menggunakan pigz( Implementasi Paralel GZip )

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


Saya juga sering menggunakannya (dan Pixz), tetapi apakah itu berfungsi ketika pipa dan output redirection ikut bermain?
Michael Wolf

1

Jawaban untuk pertanyaan "Dapatkah saya meng-zip seluruh folder menggunakan zip di linux?" Adalah dengan menggunakan sintaks:

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

Jika Anda memiliki pertanyaan baru, silakan tanyakan dengan mengklik tombol Ajukan Pertanyaan . Sertakan tautan ke pertanyaan ini jika itu membantu menyediakan konteks. - Dari Ulasan
Jeff Schaller

2
@ JeffSchaller: Ini adalah jawaban. Itu salah besar (saya percaya), tapi jelas itu adalah jawaban.
Scott

1
@ukuran: Saya cukup yakin perintah yang Anda posting tidak, pada kenyataannya, menggunakan gzip.
Dhag

1
Poin untuk menggunakan zip seperti pertanyaan yang diajukan, kemungkinan besar penulis ingin mengetahui bahwa mungkin untuk MELAKUKAN HAL YANG SAMA seperti yang biasa dilakukannya di windows. Sangat menyedihkan kebanyakan orang tidak ingin berpikir sejauh ini.
Florian Heigl

2
Sulit ketika pertanyaan menentukan ... "menggunakan gzip".
Jeff Schaller

1

Untuk kelengkapan, jika Anda ingin menar file di latar belakang, gunakan jawaban @ Shadur dan tambahkan &pada akhirnya:

tar -zcvf archive.tar.gz directory/ &

0

Jika tar Linux Anda tidak mendukung -zopsi, Anda dapat menggunakan yang berikut ini:

tar -cvf - dir | gzip > dir.tar.gz
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.