ฉันสามารถ zip ทั้งโฟลเดอร์โดยใช้ gzip ได้ไหม?


407

ฉันพยายาม zip โฟลเดอร์เป็นยูนิกซ์ สามารถทำได้โดยใช้คำสั่ง gzip?


6
คุณสามารถใช้gzip -r myfolderไฟล์ gzip ที่จะเรียกซ้ำ เช่นเดียวกับที่คุณสามารถคลายซิปไฟล์โดยใช้gunzip -r myfolder ซึ่งจะทำการคลายไฟล์ซ้ำ สำหรับข้อมูลเพิ่มเติม man gzip
Valentin Bajrami

12
ใช้tar; สนับสนุนตัวเลือกสำหรับการบีบอัด gzipถูกออกแบบมาเพื่อเติมเต็มให้tarไม่ใช่เพื่อทดแทน
devnull

13
โปรดทราบว่าคำแนะนำของ @ val0x00ff นั้นไม่ใช่สิ่งที่คุณต้องการทำ
Shadur

4
@Shadur นั่นเป็นเหตุผลที่ฉันโพสต์มันcommentเพราะนั่นไม่ใช่คำตอบสำหรับคำถามของเขา
Valentin Bajrami

2
เพื่อสาธิตสิ่งที่ @Shadur หมายถึง ได้รับไฟล์1และภายใต้โฟลเดอร์2 จะให้และและ(และไม่มากและไฟล์) ภายใต้โฟลเดอร์ไม่ใช่ไฟล์ซิปที่มีทุกสิ่งในนั้น playgroundgzip -r ./playground1.gz2.gz12playground
Jeff Xiao

คำตอบ:


660

เลขที่

ซึ่งแตกต่างจากzip, gzipฟังก์ชั่นขั้นตอนวิธีการบีบอัดเท่านั้น

เพราะเหตุผลต่างๆบางส่วนที่ฟังกลับไปยังยุคของเทปไดรฟ์, Unix ใช้โปรแกรมชื่อtarเพื่อเก็บข้อมูลที่สามารถบีบอัดด้วยโปรแกรมบีบอัดเช่นgzip, bzip2, 7zipฯลฯ

เพื่อ "zip" ไดเรกทอรีคำสั่งที่ถูกต้องจะเป็น

tar -zcvf archive.tar.gz directory/ 

นี้จะบอกtarให้

  • บีบอัดโดยใช้อัลกอริทึมz (gzip)

  • c (สร้าง) ไฟล์เก็บถาวรจากไฟล์ในdirectory( tarเรียกซ้ำโดยค่าเริ่มต้น)

  • รายการ v (verbosely) (บน / dev / stderr ดังนั้นจึงไม่ส่งผลกระทบต่อคำสั่ง piped) ไฟล์ทั้งหมดที่เพิ่มลงในไฟล์เก็บถาวร

  • และเก็บผลลัพธ์เป็นชื่อ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มีตัวเลือกและการใช้อื่น ๆ อีกมากมายมากมายเช่นกัน ฉันแนะนำให้อ่าน manpage อย่างเต็มที่ในบางครั้ง


51
เพียงเพื่อให้ได้สิ่งที่ชัดเจนมากขึ้นนี้จะ equivilant tar -cv directory | gzip > archive.tar.gzตรงกับ เก็บเป็นผลจากนั้นจะสามารถสกัดด้วยหรือแม้กระทั่งtar -zxvf zcat file.tar.gz | tar -xvชี้ให้เห็นว่า tar เป็นอิสระอย่างสมบูรณ์จาก gzip tarคำสั่งเพียงรวมถึงการสนับสนุน gzip เพื่อความสะดวก
Patrick

ฉันใช้tar cvzfมาระยะหนึ่งแล้ว สิ่งหนึ่งที่ควรทราบ: หากคุณใช้ Windows ( 7-zipระบุไว้) เพื่อคลาย*.tar.gzไฟล์มันใช้เวลาสองรอบ หนึ่งในการแตก*.tar.gzไฟล์ลงใน*.tarไฟล์ไฟล์ถัดไปเพื่อแตกไฟล์ tar นั้นลงในเนื้อหาต้นฉบับ มันจะเพิ่มเวลาขยายไฟล์ทั้งหมดโดยเฉพาะอย่างยิ่งสำหรับไฟล์ขนาดใหญ่ (เช่นบันทึก)
เจฟฟ์เสี่ยว

1
การตั้งชื่อไฟล์เก็บถาวรมีผลกับเครื่องอะไรหรือไม่? ฉันรู้ว่ามันจะเป็นการดีถ้าให้คนรู้ว่าอัลกอริทึมที่ใช้ในการซิปมัน (ดังนั้น. gz) แต่นอกเหนือจากนั้นมันมีความสำคัญอย่างไรที่คุณตั้งชื่อไฟล์เก็บถาวร?
hello_there_andy

3
@hello_there_andy มันไม่สร้างความแตกต่างให้กับยูนิกซ์ส่วนใหญ่ แต่ windows (และสมาร์ทแท็บที่สมบูรณ์ใน linux) จะทำให้สมมติฐานตามนามสกุลไฟล์
Shadur

1
@vadimkotov นี่อาจเป็นสิ่งที่คุณกำลังมองหา: superuser.com/questions/168749/…
Shadur

47

gzipคำสั่งจะไม่ซ้ำบีบอัดไดเรกทอรีเป็นไฟล์ซิปเดียวเมื่อใช้-rสวิทช์ ค่อนข้างจะเดินโครงสร้างไดเรกทอรีนั้นและ zip แต่ละไฟล์ที่พบเป็นไฟล์แยก

ตัวอย่าง

ก่อน

$ 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

ฉันเขียนสคริปต์ทั้งสองคำสั่ง:

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

(!!!) โปรดทดสอบก่อนใช้งาน (เนื่องจากมี 'rm -f' ซึ่งสามารถลบข้อมูลสำคัญได้หากใช้ในลักษณะที่ผิดปกติ)

วิธีใช้:

cd /home/; gzipdir MyDirectory หรือ gzipdir /home/MyDirectory

จะสร้าง /home/MyDirectory.tgz และลบ MyDirectory สู่ความสำเร็จ (!!!)

ungzipdir /home/MyDirectory.tgz

จะสร้าง / home / MyDirectory และลบ /home/MyDirectory.tgz เมื่อสำเร็จ


หากต้องการบีบอัดไฟล์ทั้งหมดในไดเรกทอรี: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (โปรดใช้ความระมัดระวังกับคำสั่ง find ทดสอบกับไฟล์-exec echo {}ก่อนและตรวจสอบให้แน่ใจว่าคุณไม่ได้จับภาพ './' ซึ่งจะทำให้ไดเร็กตอรี่ของ PARENT แตกไฟล์ทั้งหมดของคุณ)
andrew lorien

1

ฉันแนะนำให้ใช้pigz( การใช้งานแบบขนานของ GZip )

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


ฉันใช้มันมากเกินไป (และ pixz) แต่มันใช้งานได้เมื่อท่อและการเปลี่ยนเส้นทางออกมาเล่น
Michael Wolf

1

คำตอบสำหรับคำถาม“ ฉันสามารถ zip ทั้งโฟลเดอร์โดยใช้ zip บน linux ได้หรือไม่?” คือการใช้ไวยากรณ์:

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

หากคุณมีคำถามใหม่โปรดขอได้โดยคลิกที่ถามคำถามปุ่ม รวมลิงค์ไปยังคำถามนี้หากช่วยระบุบริบท - จากรีวิว
Jeff Schaller

2
@JeffSchaller: นี่คือคำตอบ มันเป็นสิ่งที่ผิดอย่างยิ่ง (ฉันเชื่อ) แต่มันก็เป็นคำตอบที่ชัดเจน
สกอตต์

1
@ ขนาด: ฉันค่อนข้างแน่ใจว่าคำสั่งที่คุณโพสต์ไม่ได้ใช้ gzip
dhag

1
คะแนนสำหรับการใช้ zip เหมือนคำถามที่ถามผู้เขียนมักจะชอบที่จะรู้ว่าเป็นไปได้ที่จะทำสิ่งเดียวกันในขณะที่เขาเคยทำบน windows เป็นเรื่องน่าเศร้าที่คนส่วนใหญ่ไม่ต้องการคิดไกล
Florian Heigl

2
มันยากหากคำถามระบุ ... “ ใช้ gzip”
Jeff Schaller

1

เพื่อความสมบูรณ์ถ้าคุณต้องการไฟล์ในพื้นหลังให้ใช้ @ Shadur คำตอบและผนวก&ท้าย:

tar -zcvf archive.tar.gz directory/ &

0

หาก tar linux ของคุณไม่รองรับ-zตัวเลือกคุณสามารถใช้สิ่งต่อไปนี้:

tar -cvf - dir | gzip > dir.tar.gz
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.