Nén và Giải Nén: tar, gzip, zip
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ói và né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
-tzfxem 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.