Lệnh zip: nén thư mục, giải nén bằng unzip và các tùy chọn nén
Lệnh zip gom tệp và thư mục trên Linux vào một tệp zip duy nhất rồi nén lại, còn khi giải nén thì dùng kèm unzip. Trên máy chủ AlmaLinux 9, nén thư mục trang web bằng zip -r làm 35.825 byte giảm còn 4.158 byte, và unzip -O đã sửa được tên tệp bị lỗi phông trong tệp zip tạo trên Windows.
Kết quả bên dưới được chạy bằng tài khoản root trong một thư mục làm việc trên máy chủ AlmaLinux 9.8, thời gian theo UTC. Thư mục site và các tệp ghi chú đã nén là tệp mẫu tạo ra để thử nghiệm. Tệp zip tạo trên Windows được tái hiện bằng một tệp thử nghiệm có tên tệp lưu theo CP949.
1️⃣ Cách dùng lệnh zip
Sau zip, hãy viết tên tệp zip mới trước, rồi liệt kê các tệp cần cho vào. Lệnh bên dưới nén hai tệp readme.txt và memo.txt thành một notes.zip.
zip notes.zip readme.txt memo.txt adding: readme.txt (deflated 92%)
adding: memo.txt (stored 0%)[deflated 92%] ở cuối dòng là tỷ lệ đã giảm so với kích thước gốc. [stored 0%] ở dòng của memo.txt 71 byte nghĩa là tệp được lưu nguyên kích thước gốc mà không nén.
Khi nén thư mục, hãy thêm -r. Nếu chỉ ghi tên thư mục mà không có -r, chỉ có mục thư mục site/ được cho vào, còn các tệp bên trong thì không.
zip nodir.zip site adding: site/ (stored 0%)Thư mục site cần nén gồm ba thư mục con và sáu tệp như bên dưới.
Khi thêm -r, cả mười mục đều được cho vào: các thư mục con, các tệp bên trong và cả .htaccess có tên bắt đầu bằng dấu chấm.
zip -r site.zip site adding: site/ (stored 0%)
adding: site/css/ (stored 0%)
adding: site/css/style.css (deflated 93%)
adding: site/js/ (stored 0%)
adding: site/js/app.js (deflated 87%)
adding: site/logs/ (stored 0%)
adding: site/logs/access.log (deflated 94%)
adding: site/index.html (deflated 91%)
adding: site/about.html (deflated 87%)
adding: site/.htaccess (deflated 9%)Muốn xem tệp zip đã nén xong chứa gì mà không giải nén, hãy dùng unzip -l. Tổng kích thước các tệp đã cho vào là 35.825 byte, còn site.zip xem bằng ls -l là 4.158 byte.
unzip -l site.zipArchive: site.zip
Length Date Time Name
--------- ---------- ----- ----
0 10-28-2026 22:10 site/
0 10-28-2026 22:10 site/css/
4431 10-28-2026 22:10 site/css/style.css
0 10-28-2026 22:10 site/js/
1882 10-28-2026 22:10 site/js/app.js
0 10-28-2026 22:10 site/logs/
24134 10-28-2026 22:10 site/logs/access.log
3723 10-28-2026 22:10 site/index.html
1612 10-28-2026 22:10 site/about.html
43 10-28-2026 22:10 site/.htaccess
--------- -------
35825 10 filesls -l site.zip-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip2️⃣ Tùy chọn của lệnh zip
Trong các tùy chọn của lệnh zip, -x loại các tệp khớp mẫu ra ngoài. Khi chỉ định [site/logs/*] để bỏ thư mục nhật ký, thư mục logs và access.log bị loại, chỉ còn tám mục được cho vào.
zip -r site-nolog.zip site -x 'site/logs/*' adding: site/ (stored 0%)
adding: site/css/ (stored 0%)
adding: site/css/style.css (deflated 93%)
adding: site/js/ (stored 0%)
adding: site/js/app.js (deflated 87%)
adding: site/index.html (deflated 91%)
adding: site/about.html (deflated 87%)
adding: site/.htaccess (deflated 9%)Hãy bao mẫu trong dấu nháy đơn để shell không đổi [*] thành tên tệp trước. Với cùng mục đích, tài liệu chính thức đưa ví dụ đặt dấu gạch chéo ngược trước [*].
-u chỉ cho lại vào những tệp đã thay đổi sau khi tạo tệp zip. Sau khi thêm một dòng vào cuối index.html, chạy với -ru thì chỉ riêng tệp đó được cho lại vào dưới dạng [updating].
zip -ru site.zip siteupdating: site/index.html (deflated 90%)Khi chạy lại cùng lệnh lúc không có tệp nào thay đổi, không có gì được in ra và mã thoát là 12. Trong tài liệu chính thức, 12 nghĩa là zip không có việc gì để làm.
zip -ru site.zip site; echo $?12Muốn xóa mục bên trong tệp zip, hãy dùng -d. Khi chỉ định [site/logs/*], mục thư mục logs và access.log bị xóa khỏi site.zip.
zip -d site.zip 'site/logs/*'deleting: site/logs/
deleting: site/logs/access.logCác số từ -0 đến -9 là mức nén, và theo tài liệu chính thức thì mặc định là -6. Cùng thư mục site được nén ba lần với -q, không in gì ra, để so sánh kích thước. Vì lúc thử -u đã thêm một dòng vào index.html nên tổng tệp gốc lúc này là 35.875 byte.
zip -qr -0 level0.zip sitezip -qr level6.zip sitezip -qr -9 level9.zip sitels -l level*.zip-rw-r--r-- 1 root root 37433 Oct 28 23:05 level0.zip
-rw-r--r-- 1 root root 4179 Oct 28 23:05 level6.zip
-rw-r--r-- 1 root root 3874 Oct 28 23:05 level9.zip| Mức nén | Kích thước tệp zip | So với tổng tệp gốc |
|---|---|---|
| Tổng tệp gốc | 35.875 byte | 100% |
| -0 (không nén) | 37.433 byte | 104.3% |
| -6 (mặc định) | 4.179 byte | 11.6% |
| -9 (nén tối đa) | 3.874 byte | 10.8% |
37.433 byte tạo bằng -0 lớn hơn tổng tệp gốc 35.875 byte. Đó là dữ liệu không nén cộng thêm 1.558 byte thông tin tiêu đề như tên tệp và thời gian gắn vào từng mục. -9 nhỏ hơn mặc định 305 byte, và toàn bộ chênh lệch đến từ tệp lớn nhất là access.log.
Muốn đặt mật khẩu, hãy thêm -e. Mật khẩu được nhập hai lần, và các ký tự đã nhập không hiện trên màn hình.
zip -e secret.zip memo.txtEnter password:
Verify password:
adding: memo.txt (stored 0%)Ngay cả secret.zip tạo bằng -e, khi xem bằng unzip -l vẫn hiện tên tệp, kích thước và ngày mà không cần mật khẩu. Chỉ nội dung tệp được mã hóa, nên không hợp với tài liệu cần giấu cả tên tệp.
unzip -l secret.zipArchive: secret.zip
Length Date Time Name
--------- ---------- ----- ----
71 10-28-2026 22:10 memo.txt
--------- -------
71 1 file-P, tùy chọn đưa mật khẩu thẳng vào dòng lệnh, là tùy chọn mà tài liệu chính thức cảnh báo là không an toàn, vì người dùng khác trên cùng máy chủ có thể xem các lệnh đang chạy. Tài liệu cũng mô tả bản thân cách mã hóa chuẩn của zip là tương đối yếu.
Khi giải nén tệp zip tạo bằng -e, unzip hỏi mật khẩu cho từng tệp, nhập đúng thì tệp đó được giải nén.
unzip secret.zip -d decArchive: secret.zip
[secret.zip] memo.txt password:
extracting: dec/memo.txt📌 Tùy chọn chính: kết quả chạy trong bài này
| Tùy chọn | Chức năng | Kết quả trong bài này | |
|---|---|---|---|
| zip -r | Cho vào tất cả thư mục con và tệp trong thư mục | Không có -r chỉ một dòng adding: site/, thêm -r thì có mười mục gồm cả .htaccess | |
| zip -x | Loại các tệp khớp mẫu ra ngoài | Bỏ site/logs/* thì chỉ còn tám mục, không có thư mục logs và access.log | |
| zip -u | Chỉ cho lại vào các tệp thay đổi sau khi tạo tệp zip | Một dòng updating: site/index.html (deflated 90%); không có thay đổi thì không in gì và mã thoát 12 | |
| zip -d | Xóa mục bên trong tệp zip | deleting: site/logs/ và deleting: site/logs/access.log | |
| zip -q | Ẩn các dòng hiện ra khi nén | Cả ba lệnh nén bằng -qr (-0, mặc định, -9) đều kết thúc mà không có dòng adding | |
| zip -0 | Chỉ lưu vào mà không nén | level0.zip 37433 byte, lớn hơn tổng tệp gốc | |
| zip -9 | Nén nhỏ nhất có thể (mặc định -6) | level9.zip 3874 byte, level6.zip tạo bằng mặc định 4179 byte | |
| zip -e | Hỏi mật khẩu và mã hóa nội dung | Hỏi Enter password: và Verify password:, rồi adding: memo.txt (stored 0%) | |
| unzip -l | In danh sách các mục đã lưu mà không giải nén | site.zip có 10 files, tổng 35825 byte | |
| unzip -d | Chỉ định thư mục giải nén, thư mục chưa có thì tạo mới | Bắt đầu bằng creating: restore/site/, và cấu trúc thư mục site được giải nén dưới restore | |
| unzip -o | Ghi đè tất cả tệp đã có mà không hỏi | Năm dòng inflating, không có câu hỏi | |
| unzip -n | Bỏ qua tệp đã có mà không hỏi | Sau dòng Archive: site.zip không có gì hiện ra | |
| unzip -t | Kiểm tra dữ liệu nén mà không giải nén | Mỗi mục có OK và No errors detected, broken.zip bị cắt cho End-of-central-directory signature not found | |
| unzip -O | Chỉ định bảng mã ký tự của tên tệp trong zip | Với -O CP949, tên bị lỗi hiện đúng thành 보고서.txt và 견적서.txt (tiếng Hàn nghĩa là "báo cáo" và "báo giá") | |
| unzip -p | Đưa nội dung giải nén ra đầu ra chuẩn thay vì tạo tệp | Chỉ hiện hai dòng của .htaccess mà không tạo tệp |
📎 Tùy chọn khác: theo tài liệu hướng dẫn chính thức
| Tùy chọn | Chức năng | |
|---|---|---|
| zip -m | Xóa tệp và thư mục gốc sau khi nén (xóa sau khi tệp zip đã tạo xong; tài liệu chính thức khuyên dùng kèm -T) | |
| zip -j | Chỉ lưu tên tệp, không kèm đường dẫn thư mục | |
| zip -y | Lưu liên kết tượng trưng dưới dạng liên kết thay vì tệp mà nó trỏ tới | |
| zip -T | Kiểm tra tệp zip đã tạo, nếu kiểm tra thất bại thì không thay đổi tệp zip gốc | |
| zip -f | Chỉ thay các mục đã có trong tệp zip bằng tệp đã thay đổi, không thêm tệp mới | |
| zip -i | Chỉ cho vào các tệp khớp với mẫu đã chỉ định | |
| zip -P | Ghi mật khẩu thẳng vào dòng lệnh (tài liệu chính thức cảnh báo là không an toàn) | |
| unzip -j | Giải nén riêng các tệp vào một thư mục, không tạo cấu trúc thư mục trong zip | |
| unzip -x | Chỉ định các mục không giải nén | |
| unzip -q | Ẩn các dòng hiện ra khi giải nén | |
| unzip -u | Chỉ giải nén tệp chưa có trên đĩa và tệp mới hơn | |
| unzip -v | Hiện thêm phương thức nén, kích thước sau nén, tỷ lệ và CRC trong danh sách |
3️⃣ Cách dùng lệnh unzip
Để giải nén tệp zip trên Linux, hãy ghi tên tệp zip sau unzip. Nếu không dùng -d để chỉ định thư mục, tệp sẽ được giải nén vào thư mục hiện tại (theo tài liệu chính thức), nên lần này đã chỉ định thư mục restore.
unzip site.zip -d restoreArchive: site.zip
creating: restore/site/
creating: restore/site/css/
inflating: restore/site/css/style.css
creating: restore/site/js/
inflating: restore/site/js/app.js
inflating: restore/site/index.html
inflating: restore/site/about.html
inflating: restore/site/.htaccessNếu thư mục chỉ định bằng -d chưa có, unzip sẽ tạo mới và giải nén nguyên cấu trúc thư mục site vào bên dưới.
Khi giải nén lại vào cùng chỗ, unzip dừng lại mỗi khi gặp tệp đã có và hỏi có ghi đè hay không. Chọn [N]one thì kết thúc mà không ghi đè bất kỳ tệp nào còn lại.
unzip site.zip -d restoreArchive: site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: NMuốn xử lý mà không bị hỏi, hãy thêm -o hoặc -n. -o ghi đè tất cả tệp đã có, còn -n bỏ qua tệp đã có. Vì tài liệu chính thức ghi -o là tùy chọn nguy hiểm, hãy kiểm tra trước thư mục đó có được phép ghi đè hay không rồi mới thêm -o.
unzip -o site.zip -d restoreArchive: site.zip
inflating: restore/site/css/style.css
inflating: restore/site/js/app.js
inflating: restore/site/index.html
inflating: restore/site/about.html
inflating: restore/site/.htaccessunzip -n site.zip -d restoreArchive: site.zipKhi giải nén bằng -n vào chỗ đã có đủ mọi tệp, sau dòng Archive không có gì hiện ra.
Muốn giải nén chỉ một phần tệp zip, hãy ghi đường dẫn hoặc mẫu sau tên tệp zip. Khi chỉ định [site/css/*], chỉ thư mục css và style.css được giải nén.
unzip site.zip 'site/css/*' -d partArchive: site.zip
creating: part/site/css/
inflating: part/site/css/style.css4️⃣ Lỗi unzip
Tệp zip nhận từ máy chủ khác nên được kiểm tra bằng unzip -t trước khi giải nén. Nếu dữ liệu nén không có vấn đề, mỗi mục hiện OK và dòng cuối hiện [No errors detected].
unzip -t site.zipArchive: site.zip
testing: site/ OK
testing: site/css/ OK
testing: site/css/style.css OK
testing: site/js/ OK
testing: site/js/app.js OK
testing: site/index.html OK
testing: site/about.html OK
testing: site/.htaccess OK
No errors detected in compressed data of site.zip.Tệp zip bị cắt mất phần cuối do truyền bị ngắt kết thúc bằng [End-of-central-directory signature not found]. Đây là kết quả kiểm tra bằng -t với broken.zip chỉ giữ lại 2.000 byte đầu của site.zip, tệp đã còn 2.436 byte sau khi xóa các mục logs bằng -d.
unzip -t broken.zipArchive: broken.zip
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of broken.zip or
broken.zip.zip, and cannot find broken.zip.ZIP, period.unzip đọc trước danh sách tệp nằm ở cuối cùng của tệp zip (central directory). Vì vậy với broken.zip bị cắt mất phần cuối, nó không kiểm tra được ngay cả mục đầu tiên.
Đưa vào một tệp không phải zip cũng ra cùng thông báo. Mở site.tar.gz, được gom bằng tar, bằng unzip cũng kết thúc với cùng lỗi; tệp tar.gz được giải nén bằng lệnh tar.
unzip site.tar.gzArchive: site.tar.gz
End-of-central-directory signature not found. Either this file is not
a zipfile, or it constitutes one disk of a multi-part archive. In the
latter case the central directory and zipfile comment will be found on
the last disk(s) of this archive.
unzip: cannot find zipfile directory in one of site.tar.gz or
site.tar.gz.zip, and cannot find site.tar.gz.ZIP, period.Tệp zip tạo trên Windows đôi khi lưu tên tệp theo bảng mã ký tự của Windows thay vì UTF-8. Khi mở report-win.zip, có tên lưu theo CP949, bằng unzip -l trên máy chủ UTF-8, tên tệp hiện thành các ký hiệu không đọc được.
unzip -l report-win.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 ║╕░э╝н.txt
17 10-28-2026 22:10 ░▀└√╝н.txt
--------- -------
43 2 filesNếu ghi sau -O bảng mã ký tự của Windows đã tạo tệp zip đó, tên sẽ hiện đúng, và tệp giải nén bằng cùng tùy chọn cũng được tạo với tên gốc.
unzip -O CP949 -l report-win.zipArchive: report-win.zip
Length Date Time Name
--------- ---------- ----- ----
26 10-28-2026 22:10 보고서.txt
17 10-28-2026 22:10 견적서.txt
--------- -------
43 2 filesunzip -O CP949 report-win.zip -d winArchive: report-win.zip
inflating: win/보고서.txt
inflating: win/견적서.txtTheo phần trợ giúp của unzip, -O là tùy chọn dành cho zip tạo trên DOS hoặc Windows, còn -I dành cho zip tạo trên các hệ thống khác.
Các thông báo lỗi gặp khi giải nén và việc cần kiểm tra tiếp theo như bên dưới.
| Đầu ra | Ý nghĩa | Việc cần kiểm tra tiếp |
|---|---|---|
| End-of-central-directory signature not found | Không tìm thấy danh sách tệp ở cuối tệp zip — tệp bị cắt phần cuối hoặc không phải zip | So kích thước với bản gốc rồi tải lại · tar.gz dùng tar |
| cannot find or open | Không có tệp tên đó trong thư mục hiện tại | Tên tệp và vị trí bằng ls |
| skipping: … incorrect password | Sai mật khẩu ba lần nên bỏ qua tệp đó (mã thoát 82) | Chữ hoa, chữ thường của mật khẩu và ngôn ngữ nhập |
| Tên tệp bị lỗi thành ký hiệu | Tên được lưu theo bảng mã ký tự của Windows | Bảng mã đó (như CP949) sau -O |
🔲 Trình mô phỏng lệnh zip
Trong trình mô phỏng bên dưới, bạn có thể tự gõ các bước: nén bằng zip, rồi xem danh sách hoặc giải nén bằng unzip.
🔢 FAQ & nội dung đề xuất
WordPress · Plugin
Cách cài đặt plugin WordPress: cài từ tìm kiếm, tải lên file zip và kích hoạt
Các bước cài plugin từ màn hình Thêm plugin, bằng cách tìm trong thư mục chính thức hoặc tải lên tệp zip.
Tìm kiếm
Lệnh find của Linux
Lệnh find tìm tệp theo điều kiện như tên, phần mở rộng, kích thước và ngày, rồi xử lý tiếp các tệp tìm được.
Quản lý tệp
Tùy chọn lệnh cp và cài đặt ghi đè hàng loạt khi chạy
Các tùy chọn của lệnh cp để sao chép tệp và thư mục, và cách sao chép hàng loạt không cần xác nhận ghi đè.
ℹ️ Thông báo tiếp thị liên kết
Nội dung trên trang này có chứa liên kết affiliate (tiếp thị liên kết). Khi khách truy cập mua sản phẩm hoặc dịch vụ qua các liên kết này, trang sẽ nhận hoa hồng từ bên bán. Trong quá trình đó, số tiền người mua phải trả (sẽ giảm khi có chương trình khuyến mãi ↓) không hề tăng lên. Giá, khuyến mãi và tình trạng hàng được đăng theo thời điểm viết bài và có thể khác với thực tế, vì vậy hãy kiểm tra lại lần cuối với bên bán trước khi mua. Việc chọn và đánh giá sản phẩm dựa trên tiêu chí riêng của trang; việc có nhận hoa hồng hay không không ảnh hưởng đến thứ tự giới thiệu hay nội dung đánh giá.