Tôi có thể nén toàn bộ thư mục bằng gzip không?


407

Tôi đang cố gắng nén một thư mục trong unix. Điều đó có thể được thực hiện bằng cách sử dụng lệnh gzip?


6
bạn có thể sử dụng gzip -r myfoldertệp gzip sẽ đệ quy. Giống như cách bạn có thể giải nén các tệp bằng cách sử dụng gunzip -r myfolder sẽ giải nén các tệp đệ quy. Để biết thêm thông tin, man gzip
Valentin Bajrami

12
Sử dụng tar; Nó hỗ trợ các tùy chọn để nén. gzipđược thiết kế như một sự bổ sung tar, không phải là một sự thay thế.
devnull

13
Lưu ý rằng đề xuất của @ val0x00ff gần như chắc chắn không phải là điều bạn muốn thực hiện.
Shadur

4
@Shadur đó là lý do tại sao tôi đăng nó commentvì đó không phải là câu trả lời cho câu hỏi của anh ấy.
Valentin Bajrami

2
Để hạ thấp ý nghĩa của @Shadur. Cho các tập tin 12theo thư mục playground. gzip -r ./playgroundsẽ cung cấp cho bạn 1.gz2.gz(và không có nhiều hơn 12các tệp) trong thư mục playground, KHÔNG phải là tệp được nén với mọi thứ trong đó.
Jeff Xiao

Câu trả lời:


660

Không.

Không giống như zip, gzipcó chức năng như một thuật toán nén chỉ .

Vì nhiều lý do một số trong đó nghe trở lại thời kỳ của ổ đĩa băng, Unix sử dụng một chương trình có tên tarđể lưu trữ dữ liệu, mà sau đó có thể được nén với một chương trình nén như gzip, bzip2, 7zipvv

Để "nén" một thư mục, lệnh chính xác sẽ là

tar -zcvf archive.tar.gz directory/ 

Điều này sẽ nói tarvới

  • nén nó bằng thuật toán z (gzip)

  • c (tạo) một kho lưu trữ từ các tệp trong directory( tarđược đệ quy theo mặc định)

  • danh sách v (bằng lời nói) (on / dev / stderr để nó không ảnh hưởng đến các lệnh được đường ống) tất cả các tệp mà nó thêm vào kho lưu trữ.

  • và lưu trữ đầu ra dưới dạng f (file)archive.tar.gz

Các tarlệnh cung cấp gziphỗ trợ (thông qua các -zcờ) hoàn toàn thuận tiện cho bạn. Các gziplệnh / lib là hoàn toàn tách biệt. Lệnh trên có hiệu quả tương tự như

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

Để giải nén và giải nén tệp lưu trữ vào thư mục hiện tại bạn sẽ sử dụng

tar -zxvf archive.tar.gz

Lệnh đó có hiệu quả tương tự như

gunzip < archive.tar.gz | tar -xv

tarcó nhiều, rất nhiều, NHIỀU tùy chọn khác và sử dụng là tốt; Thỉnh thoảng tôi khuyên bạn nên đọc qua trang của nó.


51
Chỉ cần làm cho mọi thứ rõ ràng hơn, điều này là chính xác tương đương tar -cv directory | gzip > archive.tar.gz. Lưu trữ kết quả sau đó có thể được trích xuất bằng tar -zxvfhoặc thậm chí zcat file.tar.gz | tar -xv. Điểm đáng chú ý là tar hoàn toàn độc lập với gzip, tarlệnh chỉ bao gồm hỗ trợ gzip để thuận tiện.
Patrick

tôi đã sử dụng tar cvzfkhá lâu một điều cần lưu ý: nếu bạn sử dụng Windows ( 7-zipsẽ được chỉ định) để giải nén một *.tar.gztệp, phải mất hai vòng. Một để giải nén *.tar.gztệp vào một *.tartệp, một để giải nén tệp tar đó vào nội dung ban đầu. nó làm tăng tổng thời gian giải nén, đặc biệt đối với các tệp lớn (ví dụ: nhật ký)
Jeff Xiao

1
Việc đặt tên của kho lưu trữ có ảnh hưởng gì đến máy móc không? Tôi biết sẽ rất tốt nếu cho mọi người biết thuật toán ban đầu được sử dụng để nén nó (do đó .gz), nhưng điều đó thực sự quan trọng đến việc bạn đặt tên cho kho lưu trữ như thế nào?
xin chào_there_andy

3
@hello_there_andy Không có sự khác biệt đối với hầu hết các unix, nhưng các cửa sổ (và hoàn thành tab thông minh trong linux) sẽ đưa ra các giả định dựa trên phần mở rộng tên tệp.
Shadur

1
@vadimkotov Đây có thể là những gì bạn đang tìm kiếm: superuser.com/questions/168749/iêu
Shadur

47

Các gziplệnh sẽ không đệ quy nén một thư mục thành một file zip duy nhất, khi sử dụng -rcông tắc. Thay vào đó, nó sẽ chuyển cấu trúc thư mục đó và nén từng tệp mà nó tìm thấy thành một tệp riêng.

Thí dụ

trước

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

bây giờ chạy gziplệnh

$ gzip -r dir1

sau

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

Nếu bạn muốn nén cấu trúc thư mục thì có thể bạn sẽ muốn sử dụng tarlệnh và sau đó nén .tartệp kết quả .

$ tar zcvf dir1.tar.gz dir1/

Thí dụ

$ 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

Kết quả trong tập tin duy nhất sau đây:

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

Bạn có thể xác nhận nội dung của nó:

$ 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

Tôi viết kịch bản 2 lệnh này:

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

(!!!) Vui lòng kiểm tra trước khi sử dụng (vì có 'rm -f' có khả năng xóa dữ liệu quan trọng nếu được sử dụng theo cách không phổ biến).

Cách sử dụng:

cd /home/; gzipdir MyDirectory hoặc là gzipdir /home/MyDirectory

Sẽ tạo /home/MyDirectory.tgz và xóa MyDirectory khi thành công (!!!).

ungzipdir /home/MyDirectory.tgz

Sẽ tạo / home / MyDirectory và xóa /home/MyDirectory.tgz khi thành công.


Để nén tất cả các tệp trong một thư mục: find ./* -maxdepth 0 -type d -exec gzipdir {} \; (hãy cẩn thận với lệnh find, -exec echo {}trước tiên hãy kiểm tra nó và đảm bảo bạn không chụp './', nó sẽ nén thư mục PARENT, có thể phá vỡ toàn bộ thư mục nhà của bạn)
rút lorien

1

Tôi khuyên bạn nên sử dụng pigz( Triển khai song song GZip )

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


Tôi cũng sử dụng nó rất nhiều (và pixz), nhưng nó có hoạt động khi các đường ống và chuyển hướng đầu ra đi vào hoạt động không?
Michael Wolf

1

Câu trả lời cho câu hỏi. Tôi có thể nén toàn bộ thư mục bằng cách sử dụng zip trên linux không?

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

Nếu bạn có một câu hỏi mới, vui lòng hỏi nó bằng cách nhấp vào nút Đặt câu hỏi . Bao gồm một liên kết đến câu hỏi này nếu nó giúp cung cấp bối cảnh. - Từ đánh giá
Jeff Schaller

2
@JeffSchaller: Đây là một câu trả lời. Đó là một sai lầm nghiêm trọng (tôi tin), nhưng rõ ràng nó là một câu trả lời.
Scott

1
@ize: Tôi khá chắc chắn rằng lệnh bạn đã đăng không thực sự sử dụng gzip.
dhag

1
Các điểm để sử dụng zip như câu hỏi được hỏi, rất có thể tác giả muốn biết rằng có thể LÀM NHỮNG CÙNG CHÍNH XÁC như anh ta thường làm trên các cửa sổ. Thật đáng buồn khi hầu hết mọi người không muốn nghĩ xa.
Florian Heigl

2
Thật khó khăn khi câu hỏi chỉ định ... bằng cách sử dụng gzip.
Jeff Schaller

1

Để hoàn thiện, nếu bạn muốn tar tệp trong nền, hãy sử dụng câu trả lời của @ Shadur và nối &vào cuối:

tar -zcvf archive.tar.gz directory/ &

0

Nếu tar linux của bạn không hỗ trợ -ztùy chọn, bạn có thể sử dụng như sau:

tar -cvf - dir | gzip > dir.tar.gz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.