Lệnh zip: nén thư mục, giải nén bằng unzip và các tùy chọn nén

Môi trường thử nghiệmHọ RHELAlmaLinux 9.8Tài khoản rootKiểm tra ngày 2026-11-05
Lệnh nén · lưu trữzipunzipVị trí/usr/bin/zip
Nén thư mục và giải nén bằng unzip

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

  • ↪️ Nén tệp và nén thư mục (-r)

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.

site/
css/
style.css
js/
app.js
logs/
access.log
index.html
about.html
.htaccess

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.zip
Archive:  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 files
ls -l site.zip
-rw-r--r-- 1 root root 4158 Oct 28 23:05 site.zip

2️⃣ Tùy chọn của lệnh zip

  • ↪️ -x, -u, -d, mức nén, -e

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 site
updating: 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 $?
12

Muố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.log

Cá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 site
zip -qr level6.zip site
zip -qr -9 level9.zip site
ls -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énKích thước tệp zipSo với tổng tệp gốc
Tổng tệp gốc35.875 byte100%
-0 (không nén)37.433 byte104.3%
-6 (mặc định)4.179 byte11.6%
-9 (nén tối đa)3.874 byte10.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.txt
Enter 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.zip
Archive:  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 dec
Archive:  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ọnChức năngKết quả trong bài này
zip -rCho vào tất cả thư mục con và tệp trong thư mụcKhông có -r chỉ một dòng adding: site/, thêm -r thì có mười mục gồm cả .htaccess
zip -xLoại các tệp khớp mẫu ra ngoàiBỏ site/logs/* thì chỉ còn tám mục, không có thư mục logs và access.log
zip -uChỉ cho lại vào các tệp thay đổi sau khi tạo tệp zipMộ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 -dXóa mục bên trong tệp zipdeleting: site/logs/ và deleting: site/logs/access.log
zip -qẨn các dòng hiện ra khi nénCả 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 -0Chỉ lưu vào mà không nénlevel0.zip 37433 byte, lớn hơn tổng tệp gốc
zip -9Né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 -eHỏi mật khẩu và mã hóa nội dungHỏi Enter password: và Verify password:, rồi adding: memo.txt (stored 0%)
unzip -lIn danh sách các mục đã lưu mà không giải nénsite.zip có 10 files, tổng 35825 byte
unzip -dChỉ định thư mục giải nén, thư mục chưa có thì tạo mớiBắ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 -oGhi đè tất cả tệp đã có mà không hỏiNăm dòng inflating, không có câu hỏi
unzip -nBỏ qua tệp đã có mà không hỏiSau dòng Archive: site.zip không có gì hiện ra
unzip -tKiểm tra dữ liệu nén mà không giải nénMỗi mục có OK và No errors detected, broken.zip bị cắt cho End-of-central-directory signature not found
unzip -OChỉ định bảng mã ký tự của tên tệp trong zipVớ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ệpChỉ 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ọnChức năng
zip -mXó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 -jChỉ lưu tên tệp, không kèm đường dẫn thư mục
zip -yLư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 -TKiể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 -fChỉ 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 -iChỉ cho vào các tệp khớp với mẫu đã chỉ định
zip -PGhi 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 -jGiả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 -xChỉ đị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 -uChỉ giải nén tệp chưa có trên đĩa và tệp mới hơn
unzip -vHiệ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 zip trên Linux với -d, -o và -n

Để 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 restore
Archive:  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/.htaccess

Nế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 restore
Archive:  site.zip
replace restore/site/css/style.css? [y]es, [n]o, [A]ll, [N]one, [r]ename: N

Muố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 restore
Archive:  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/.htaccess
unzip -n site.zip -d restore
Archive:  site.zip

Khi 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 part
Archive:  site.zip
   creating: part/site/css/
  inflating: part/site/css/style.css

4️⃣ Lỗi unzip

  • ↪️ End-of-central-directory và tên tệp bị lỗi phông

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.zip
Archive:  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.zip
Archive:  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.gz
Archive:  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.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   ║╕░э╝н.txt
       17  10-28-2026 22:10   ░▀└√╝н.txt
---------                     -------
       43                     2 files

Nế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.zip
Archive:  report-win.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
       26  10-28-2026 22:10   보고서.txt
       17  10-28-2026 22:10   견적서.txt
---------                     -------
       43                     2 files
unzip -O CP949 report-win.zip -d win
Archive:  report-win.zip
  inflating: win/보고서.txt
  inflating: win/견적서.txt

Theo 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ĩaViệc cần kiểm tra tiếp
End-of-central-directory signature not foundKhô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 zipSo kích thước với bản gốc rồi tải lại · tar.gz dùng tar
cannot find or openKhông có tệp tên đó trong thư mục hiện tạiTên tệp và vị trí bằng ls
skipping: … incorrect passwordSai 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ệuTên được lưu theo bảng mã ký tự của WindowsBả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.

Trình mô phỏng lệnh zipZip 3.0 · UnZip 6.00
[root@server work]#
Chỉ chạy trong trình duyệt và không nén tệp thật. Tỷ lệ nén là giá trị đo thực tế, còn tệp tạo mới trong trình mô phỏng là giá trị ước tính. Dùng ↑↓ để gọi lại các lệnh đã gõ trước đó.

🔢 FAQ & nội dung đề xuất

Mở tệp .gz nén bằng gzip bằng unzip thì kết thúc với [End-of-central-directory signature not found]. Giải nén bằng [gzip -d readme.txt.gz] thì readme.txt.gz trở lại thành readme.txt. Còn .tar.gz, gom nhiều tệp bằng tar rồi nén bằng gzip, thì giải nén một lần bằng tar.

Trên máy chủ AlmaLinux 9 đã kiểm tra, zip và unzip lần lượt là lệnh do gói zip và unzip cài đặt. Vì vậy, dòng RHEL cài bằng [sudo dnf install zip unzip], còn dòng Debian cài bằng [sudo apt install zip unzip] (theo danh sách gói chính thức của Debian).

Ghi tệp zip và đường dẫn bên trong sau unzip -p, nội dung sẽ hiện thẳng ra màn hình. Chạy [unzip -p site.zip site/.htaccess] thì chỉ hiện hai dòng của .htaccess mà không tạo tệp.

ℹ️ 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á.

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Prove your humanity: 0   +   9   =