Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> Linux

Cách nén, di chuyển và giải nén thư mục trong Linux một dòng lệnh

Khi cần di chuyển thư mục chứa nhiều tệp (ví dụ: dữ liệu database) giữa các vị trí trên cùng máy chủ Linux, muốn đảm bảo toàn vẹn dữ liệu và giữ nguyên quyền sở hữu/permission/timestamp, có một thủ thuật "one-liner" cực kỳ hiệu quả dùng tar pipe.

Ví dụ thực tế

Di chuyển nội dung /var/lib/mysql → /opt/mysql:

# cd /var/lib/mysql
# tar cf - * | ( cd /opt/mysql; tar xfp - )

Giải thích cơ chế

  1. cd /var/lib/mysql: Vào thư mục nguồn.
  2. tar cf - *: Tạo archive tar từ tất cả nội dung thư mục hiện tại (*), ghi ra stdout (-). Không ghi ra đĩa trung gian.
  3. |: Pipe (ống dẫn) stdout của lệnh trước thành stdin của lệnh sau.
  4. ( cd /opt/mysql; tar xfp - ): Subshell – đổi thư mục đến đích, sau đó giải nén từ stdin (-).
  5. tar xfp: x (extract), f - (file từ stdin), p (preserve permissions – giữ quyền, owner, timestamp).

Ưu điểm so với cp -a hoặc rsync

  • Atomic hơn cp: Đọc và ghi đồng thời qua pipe, giảm rủi ro hỏng dữ liệu nếu ổ cứng lỗi giữa chừng.
  • Giữ toàn bộ metadata: p flag bảo toàn permission, owner, group, mtime, symlink.
  • Không cần dung lượng đĩa tạm: Không tạo file nén trung gian.
  • Hiệu quả trên cùng filesystem: Nhanh hơn rsync cho copy cục bộ lượng lớn tệp nhỏ.

Biến thể hữu ích

Thêm nén (gzip) – cho truyền qua mạng hoặc tiết kiệm I/O

# cd /source
# tar czf - * | ( cd /dest; tar xzf - )

Dùng rsync (linh hoạt hơn, có progress, resume)

# rsync -avh --progress /var/lib/mysql/ /opt/mysql/
  • -a (archive) = -rlptgoD (recursive, links, perms, times, group, owner, devices).
  • -h human-readable, --progress hiển thị tiến độ.
  • Hỗ trợ resume nếu bị ngắt, copy qua SSH: rsync -avz /src/ user@remote:/dest/.

Dùng cp -a (đơn giản, hiệu quả trên Linux hiện đại)

# cp -a /var/lib/mysql/. /opt/mysql/

Dấu chấm . sau thư mục nguồn đảm bảo copy nội dung chứ không copy chính thư mục mysql vào /opt/mysql/mysql.

Lưu ý quan trọng

  • Chạy với quyền root (sudo) để bảo toàn owner/group của tệp hệ thống (như MySQL data).
  • Đảm bảo thư mục đích đã tồn tại (mkdir -p /opt/mysql).
  • Nếu thư mục nguồn đang được ghi bởi dịch vụ (MySQL đang chạy), hãy dừng dịch vụ trước hoặc dùng snapshot (LVM/ZFS/btrfs) để đảm bảo tính nhất quán.