🧩 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.