Làm cách nào để tôi nén / giải nén trên dòng lệnh unix?


541

Làm cách nào tôi có thể tạo và trích xuất kho lưu trữ zip từ dòng lệnh?


3
@joachim, bạn nên đặt câu hỏi trong một câu hỏi và cung cấp câu trả lời trong câu trả lời. Không có vấn đề gì với việc trả lời các câu hỏi của riêng bạn nhưng không phải là một phần của chính câu hỏi, vì điều đó phá vỡ toàn bộ lợi thế của phiếu bầu cộng đồng về phiếu trả lời tốt nhất của SO. Ngoài ra, điều này có lẽ phù hợp hơn với siêu người dùng vì nó không liên quan đến lập trình.

2
Bạn sẽ ghi lại tài liệu làm thế nào để truy cập trực tuyến và kiểm tra SO nếu bạn quên đăng nhập?

@ rlb.usa: Tôi làm việc ở nhiều nơi khác nhau trên nhiều máy chủ khác nhau. Sử dụng SA cho một ghi chú như thế này cũng giúp người khác, như tôi thấy.
joachim

Câu trả lời:


663

Thông thường, người ta sử dụng tarđể tạo một kho lưu trữ không nén và gziphoặc bzip2để nén kho lưu trữ đó. Các lệnh gunzipbunzip2lệnh tương ứng có thể được sử dụng để giải nén tệp lưu trữ đã nói hoặc bạn chỉ có thể sử dụng các cờ trên tarlệnh để thực hiện giải nén.

Nếu bạn đang đề cập cụ thể đến định dạng tệp Zip , bạn chỉ cần sử dụng các lệnh zipunzip.

Để nén:

zip squash.zip file1 file2 file3

hoặc để nén một thư mục

zip -r squash.zip dir1

Để giải nén:

unzip squash.zip

Điều này giải nén nó trong thư mục làm việc hiện tại của bạn.


72
Cá nhân tôi chỉ sử dụng zip -r9 archive.zip files...cú pháp (-r = đệ quy -9 = nén tối đa).
amphetamachine

3
Cũng như một lưu ý phụ: zipcó thể tạo ra nhiều hương vị khác nhau của tài liệu lưu trữ .ZIP, cũng như sử dụng nhiều máy nén khác nhau. Mặt khác, có một số công cụ nén khác có tên tương tự: 7-Zip, gzip, bzip2, rzip, v.v. không thể thay thế cho nhau.
Polemon

5
Trong trường hợp bạn không muốn bao gồm thư mục mẹ:cd dir1; zip -r ../squash.zip *
Marinos An

Tôi bối rối, tôi đã làm điều này và nhận được một danh sách dài các trích xuất và trích xuất nhưng khi tôi kiểm tra thư mục thì nó trống, lưu lại cho tệp zip gốc? Tất cả đang đi đâu?
Nhà phát triển mùa hè

11
Đối với bản ghi, sử dụng unzip -d myfolder squash.zipđể trích xuất vào một thư mục mới riêng ( myfolder) thay vì đặt tất cả các tệp trực tiếp vào thư mục hiện tại, điều này có thể gây khó chịu nếu tệp zip chứa nhiều tệp và thư mục ở cấp cao nhất. Điều này bắt chước cách hầu hết các công cụ giải nén UI hoạt động.
Alexander Klimetschek

64

Có một thực sự lớn số cách khác nhau để nén và giải nén dưới các dẫn xuất UNIX vì vậy tôi sẽ giả sử bạn có nghĩa là "zip" theo nghĩa chung chung chứ không phải là một cụ định dạng tập tin.

Bạn có thể nén các tệp lên (ở định dạng nén) bằng tarchương trình GNU :

tar -zcvf myfile.tgz .

mà sẽ làm thư mục hiện tại. Thay thế .bằng tên tập tin khác nếu bạn muốn một cái gì đó khác.

Để giải nén tập tin đó, sử dụng:

tar -zxvf myfile.tgz

Tất nhiên, điều đó giả định rằng bạn có tarkhả năng thực hiện việc nén cũng như kết hợp các tệp thành một.

Nếu không, bạn chỉ có thể sử dụng tar cvftheo sau gzip(một lần nữa, nếu có) để nén và gunziptheo sau tar xvf.


Để xử lý cụ thể các tệp định dạng ZIP, tôi khuyên bạn nên tải xuống 7zipvà sử dụng tệp đó - nó nhận ra rất nhiều định dạng tệp, bao gồm cả tệp ZIP.


Hoặc sử dụng tar jcvf file.tar.bz2...để nén ở định dạng bzip2 hoặc tar Jcvf file.tar.xz ...để nén xz.
OldTimer

4
Tôi đánh giá thấp câu trả lời của bạn vì câu hỏi là về cách xử lý tài liệu lưu trữ zip không phải tệp tar.
Sao biển

3
@ Starfish, điều đó chắc chắn nằm trong quyền của bạn, cảm ơn vì ít nhất là giải thích lý do tại sao, rất nhiều người không dành thời gian để làm điều đó :-) Tôi lấy "zip" theo nghĩa chung hơn (nén) thay vì một định dạng cụ thể, Vì vậy, tôi sẽ làm cho điều đó rõ ràng hơn.

Xin lưu ý rằng kho lưu trữ tar có thể không hoạt động chính xác khi di chuyển giữa các nền tảng khác nhau, mac sang linux hoặc ngược lại. Zip an toàn hơn nhiều, vì nó hoạt động chính xác trên tất cả các hệ thống.
dùng1751825

Tôi cho rằng về mặt kỹ thuật đây là gzip, vậy là tốt rồi. Tôi đoán. Khá rõ ràng không phải những gì câu hỏi yêu cầu mặc dù.

30

Nếu bạn chưa cài đặt các gói zip và giải nén và bạn có java, bạn có thể sử dụng jarđể giải nén:

jar -xf file.zip

3
Không phải máy chủ của tôi, không giải nén, zip, 7z, không có gì ... Và điều này đã hoạt động. Cảm ơn!
Dariusz

2
Đây là một mẹo tuyệt vời.
Sao biển

29

Chà, khi nói đến việc phân phối tệp cho nhiều hệ điều hành, tôi khuyên dùng 7-zip .

Thông thường trong gói p7zip, bạn sẽ nhận được lệnh 7z7zalệnh mà bạn có thể tạo tài liệu lưu trữ 7z của riêng mình.

7zacũng có thể giải nén tài liệu lưu trữ zip tiêu chuẩn ( pkzip ) (và tạo chúng cũng bằng công -tziptắc).

Nén:

7za a archive.7z file1 file2 directory/

Giải nén:

7za x archive.7z

Nó cũng có thể tạo tài liệu lưu trữ tự giải nén bằng công -sfxtắc:

7za a -sfx archive.exe files1 file2 dir

Tôi khuyên dùng phương pháp này trong trường hợp người dùng Windows không thể mở tài liệu lưu trữ 7z (trong trường hợp bạn muốn tư vấn một công cụ cho việc đó: PeaZip ).

Nếu bạn muốn sử dụng cùng một thuật toán nén với tarball của mình, hãy sử dụng công -Jtắc với tar:

tar cJf archive.tar.xz file1 file2 dir

xzlà một công cụ UNIX, có sử dụng LZMA2 cho nén, nhưng hoạt động đường gz, bz2, vv hoạt động. Nó thậm chí hoạt động như một bộ lọc.

7z không tạo tài liệu lưu trữ với thông tin hệ thống tệp đầy đủ trên UNIX, vì vậy bạn cần sử dụng tartrước khi sử dụng 7z (nhưng vì 7z lưu trữ thông tin khác về tartệp, tôi khuyên bạn nên sử dụng xz, vì nó được thiết kế cho nó):

tar cf - file1 file2 dir | 7za z -si archive.tar.7z

2
Tôi có lẽ nên nối câu trả lời này với atool, đó là một công cụ nhỏ xinh giúp sử dụng nhiều máy nén khác nhau thoải mái hơn. Liên kết với avà tạo một kho lưu trữ trở thành a arc.7z folder/hoặc trích xuất một cách đơn giảna arc.7z
polemon

21
unzip <filename>

zip -r archive.zip <filename> [filename]

Bạn sẽ cần đảm bảo các lệnh này được cài đặt thông qua trình quản lý gói của bạn. Không khó hơn sử dụng bất cứ thứ gì khác trên dòng lệnh. Nó chắc chắn đơn giản hơn việc tạo tài liệu lưu trữ bằng tar.


Tôi biết đây là một chủ đề cũ nhưng đây là câu trả lời tốt nhất. Không nói về 7z hay tar, nó ngắn gọn và đi thẳng vào vấn đề
Kyle

4

BSD Tar cũng có thể làm điều này

bsdtar acf bravo.zip alfa.jpg

Hoặc là:

bsdtar xf bravo.zip

BSD tarcó lợi ích là hỗ trợ khá nhiều định dạng nén bổ sung so với GNU tarvà các tars khác . Lợi ích lớn nhất là, có lẽ, nó làm như vậy trong khi sử dụng tarcú pháp giống như . Bạn chắc chắn có thể sử dụng 7z, unrar, unzip, vv từ dòng lệnh, nhưng họ sử dụng một khác nhau cú pháp.
njsg

3

Câu trả lời chuẩn nhất là pax, được khuyến nghị hơn cpiotar.

Không giống như cpiovà POSIX tar, nhưng giống như GNU tar, paxcó thể vừa lưu trữ tệp và nén tệp lưu trữ. Hành vi này khác với zip, nén từng tệp trước khi đưa nó vào kho lưu trữ.


1
paxhỗ trợ lưu trữ zip?
Sao biển

Không và nó cũng không hỗ trợ paxtài liệu lưu trữ!
roblogic

2

Điều này chỉ bao gồm khai thác.

Vì thế, tôi đã bắt đầu sử dụng dtrx.

Toàn bộ điểm của nó là để loại bỏ sự phức tạp. Vì vậy, bạn chỉ cần chuyển vào bất kỳ kho lưu trữ nào cho nó và nó chỉ ra những gì cần phải được thực hiện với nó. Zip, tar, gz ... Sử dụng luôn giống nhau - dtrx archive.zip. Nó hỏi một vài câu hỏi và bạn đã hoàn thành.

dtrxcó sẵn trong hầu hết các kho lưu trữ, vì vậy bạn có thể apt| yumcài đặt nó.


1

Tôi thường thấy mình đang cố gắng nén các tệp đã sửa đổi trong thư mục công việc của mình - để sao chép tất cả các tệp đã sửa đổi vào thư mục công việc hộp cát khác hoặc để bảo quản chúng trong một thời gian ngắn vì tôi muốn hoàn tác một số thay đổi.

Trong trường hợp đó, tôi sao chép danh sách các tệp đã sửa đổi vào một tệp tạm thời và sử dụng zipvới tùy chọn -@.

Giả sử tôi đã sửa đổi các tệp Foo.h, Bar.cc và TestBar.cc.

Giả sử tôi tạo một tệp có tên là Sửa đổi-files.txt có nội dung là:

Foo.h
Bar.cc
TestBar.cc

Tôi thực hiện lệnh sau để nén các tệp đó:

cat modified-files.txt | zip modified-files.zip -@
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.