Nén và Giải Nén: tar, gzip, zip

K
Kai··4 min read

Bạn sẽ liên tục cần gói nhiều file thành một và nén lại: để backup, để gói log gửi đi, để tải mã nguồn về. Bài này làm rõ hai khái niệm hay bị lẫn — góinén — và bộ cờ tar nổi tiếng khó nhớ.

Gói khác nén

Đây là điểm cốt lõi:

  • Gói (archive): gộp nhiều file/thư mục thành một file duy nhất. Công cụ: tar. Bản thân việc gói không làm nhỏ đi.
  • Nén (compress): làm một file nhỏ lại. Công cụ: gzip (và bzip2, xz, zstd...).
   nhiều file        tar (gói)         gzip (nén)
   ┌───┐┌───┐┌───┐   ──────►  ┌──────┐  ──────►  ┌──────────┐
   │ a ││ b ││ c │            │ .tar │           │ .tar.gz  │
   └───┘└───┘└───┘            │(1 file)│          │(nhỏ hơn) │
                              └──────┘           └──────────┘

Trên Linux, mẫu phổ biến nhất là kết hợp cả hai: dùng tar gói rồi gzip nén, ra file .tar.gz (hay viết tắt .tgz). May là tar làm được cả hai trong một lệnh nhờ cờ -z.

tar: nhớ các cờ

tar mang tiếng khó vì cờ của nó. Cách nhớ: ghép vài chữ cái, mỗi chữ một việc:

   c  = create   (tạo archive)        ┐ chọn 1 trong 3
   x  = extract  (giải nén)           ┤ (hành động)
   t  = list     (liệt kê nội dung)   ┘
   z  = qua gzip  (.gz)               → thêm khi làm việc với .tar.gz
   v  = verbose   (in tên file ra)    → tùy chọn, để thấy nó đang làm gì
   f  = file      (chỉ định tên file) → gần như luôn cần, đặt CUỐI

Ba thao tác bạn dùng 99% thời gian:

Tạo archive nén (c + z + f):

tar -czf proj.tar.gz proj/

Gói thư mục proj/ thành proj.tar.gz. (Nhớ: f đứng cuối, ngay trước tên file đích.)

Xem nội dung mà không giải nén (t + z + f):

tar -tzf proj.tar.gz
proj/
proj/src/
proj/src/app.txt
proj/README.md

Luôn nên -tzf để xem trước khi giải nén — biết nó sẽ bung ra cái gì, ở đâu.

Giải nén (x + z + f):

tar -xzf proj.tar.gz            # giải ra thư mục hiện tại
tar -xzf proj.tar.gz -C /opt    # -C: giải ra thư mục khác (/opt)

Mẹo nhớ vui: "eXtract Ze File" cho xzf, "Create Ze File" cho czf.

Lưu ý "tar bomb": vài archive bung file thẳng ra thư mục hiện tại (không gói trong một thư mục con), làm rác chỗ bạn đang đứng. Đó là lý do nên -tzf xem trước, hoặc giải vào một thư mục riêng bằng -C.

gzip: nén một file

gzip nén đúng một file (không gói nhiều file — đó là việc của tar):

gzip big.txt        # tạo big.txt.gz và XÓA big.txt gốc
gunzip big.txt.gz   # giải nén lại, khôi phục big.txt

Lưu ý gzip thay thế file gốc bằng bản .gz (và gunzip thì ngược lại). Nếu muốn giữ bản gốc, dùng gzip -k (keep). Bạn hay gặp .gz đơn lẻ với file log (access.log.1.gz); xem nhanh nội dung mà không giải nén bằng zcat file.gz hoặc zless file.gz.

zip: khi cần tương thích Windows

.tar.gz là chuẩn của thế giới Unix/Linux. Khi cần trao đổi với người dùng Windows/macOS, .zip tiện hơn vì mở được sẵn ở mọi nơi:

apt-get install -y zip unzip    # Ubuntu thường chưa cài sẵn
zip -r proj.zip proj/           # -r để gói cả thư mục
unzip proj.zip                  # giải nén
unzip -l proj.zip               # -l xem nội dung

Khác tar.gz, zip vừa gói vừa nén trong một định dạng, và mỗi file nén riêng (nên .tar.gz thường nhỏ hơn khi có nhiều file nhỏ giống nhau).

Chọn cái nào

Tình huống Dùng
Backup/di chuyển trên Linux, nhiều file tar -czf (.tar.gz)
Nén một file lẻ (vd log) gzip
Gửi cho người dùng Windows/macOS zip
Cần nén mạnh hơn, chấp nhận chậm hơn tar -cJf (.tar.xz) hoặc zstd

Thực tế: trên server Linux bạn dùng tar -czf / tar -xzf nhiều nhất. Thuộc hai lệnh đó là đủ cho phần lớn công việc.

🧹 Dọn dẹp

cd /tmp && rm -rf proj proj.tar.gz proj.zip out big.txt*

Tổng kết

Gói (tar) gộp nhiều file thành một; nén (gzip) làm file nhỏ lại; kết hợp ra .tar.gz. Với tar, nhớ ba thao tác: tạo -czf, xem -tzf, giải -xzf (kèm -C để chọn nơi giải, -v để xem tiến trình). gzip/gunzip cho file lẻ (thay thế file gốc). zip/unzip khi cần tương thích Windows. Luôn -tzf xem trước khi giải nén lạ.

Backup file rồi, nhưng "đĩa đầy" là sự cố server kinh điển. Bài 10 học cách kiểm tra dung lượng và quản lý ổ đĩa: df, du, lsblk, mount.