Tự động xóa bản backup cũ

🧩 Bối cảnh

Trong quá trình quản trị hệ thống, chúng ta thường thực hiện backup định kỳ dữ liệu. Ví dụ:

  • Mỗi ngày tạo 1 file dump database (*.sql)
  • Mỗi ngày nén source code hoặc dữ liệu ứng dụng (*.tar.gz)

Sau một thời gian, thư mục chứa backup sẽ bị đầy nếu không có cơ chế dọn dẹp hợp lý.

📌 Vấn đề đặt ra:
Làm thế nào để chỉ giữ lại 3 bản backup mới nhất của mỗi loại file và tự động xóa những bản cũ hơn?

📁 Ví dụ thư mục backup

Dưới đây là ví dụ về cấu trúc thư mục /home/digiinfra.production/backup:

shell> ls -l /home/digiinfra.production/backup

-rw-r--r-- 1 root root   4093982 Jun 19 23:00 db_2300190625.sql
-rw-r--r-- 1 root root   4867971 Jun 20 23:00 db_2300200625.sql
-rw-r--r-- 1 root root   5012345 Jun 21 23:00 db_2300210625.sql
-rw-r--r-- 1 root root 633447985 Jun 19 23:01 digiinfra_production_2300190625.tar.gz
-rw-r--r-- 1 root root 637819734 Jun 20 23:01 digiinfra_production_2300200625.tar.gz
-rw-r--r-- 1 root root 640000000 Jun 21 23:01 digiinfra_production_2300210625.tar.gz

Giả sử hôm nay là 21/06, bạn muốn chỉ giữ lại 3 file .sql mới nhất và 3 file .tar.gz mới nhất, xóa phần còn lại.

⚙️ Lệnh shell một dòng thực hiện điều đó

(
  ls -tp /home/digiinfra.production/backup/*.sql | grep -v '/$' | tail -n +4
  ls -tp /home/digiinfra.production/backup/*.tar.gz | grep -v '/$' | tail -n +4
) | xargs -r rm --

🛠️ Giải thích.

  • ls -tp *.sql

Liệt kê danh sách file .sql theo thứ tự mới nhất trước (-t), có thêm dấu / với thư mục (-p). Ví dụ:

/home/.../db_2300210625.sql
/home/.../db_2300200625.sql
/home/.../db_2300190625.sql
  • grep -v '/$'

Loại bỏ các dòng là thư mục (nếu có). Kết quả vẫn là danh sách file.

  • tail -n +4

Bỏ 3 dòng đầu (tức là giữ lại 3 bản mới nhất), phần còn lại sẽ được xóa.

  • xargs -r rm --

Nhận danh sách file từ stdin và thực hiện lệnh rm để xóa file cũ.
Tùy chọn -r giúp tránh lỗi nếu không có file để xóa.

💡 Mẹo kiểm tra an toàn

Bạn có thể thay rm bằng echo rm để kiểm tra trước khi xóa thật:

(
  ls -tp /home/digiinfra.production/backup/*.sql | grep -v '/$' | tail -n +4
  ls -tp /home/digiinfra.production/backup/*.tar.gz | grep -v '/$' | tail -n +4
) | xargs -r echo rm --

🔄 Mô phỏng hoạt động

📦 /backup
├── db_2300190625.sql         🗑️
├── db_2300200625.sql         ✅
├── db_2300210625.sql         ✅
├── db_2300220625.sql         ✅
├── digiinfra_2300190625.tar.gz  🗑️
├── digiinfra_2300200625.tar.gz  ✅
├── digiinfra_2300210625.tar.gz  ✅
├── digiinfra_2300220625.tar.gz  ✅

Kết quả sau khi chạy lệnh:

  • Các bản cũ nhất sẽ được xóa.
  • Chỉ giữ lại 3 bản mới nhất của mỗi loại.

🕒 Gợi ý thiết lập tự động (Cron job)

Để lệnh này chạy tự động mỗi ngày lúc 00:30 sáng, bạn có thể thêm vào crontab:

crontab -e

Thêm dòng:

30 0 * * * (ls -tp /home/digiinfra.production/backup/*.sql | grep -v '/$' | tail -n +4; ls -tp /home/digiinfra.production/backup/*.tar.gz | grep -v '/$' | tail -n +4) | xargs -r rm --

✅ Kết luận

Việc dọn dẹp backup cũ là một bước cực kỳ quan trọng để tiết kiệm dung lượng và đảm bảo hệ thống luôn ổn định. Với một dòng lệnh đơn giản, bạn có thể chủ động kiểm soát số lượng bản backup giữ lại, tránh tràn đĩa hoặc lưu trữ dư thừa không cần thiết.

Bài viết gần đây

spot_img

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here

Đăng ký nhận thông tin bài viết qua email