Tìm và xóa file 0 byte trong Linux bằng find
Hướng dẫn Linux Server · cập nhật 26/07/2026
Để xóa file 0 byte trong Linux, bạn dùng find với tùy chọn -size 0c để lọc rồi thêm -delete để xóa. Việc này mất chưa tới một phút, phần lâu nhất là bước xem trước danh sách trước khi xóa thật.
File rỗng sinh ra khi tiến trình tạo file rồi chết trước lúc ghi, khi log bị xoay vòng, hoặc khi lệnh copy đứt giữa chừng. Chúng chiếm 0 byte dung lượng nhưng vẫn tốn mỗi file một inode, nên hàng chục nghìn file loại này có thể làm phân vùng báo hết chỗ dù df -h còn trống nhiều.
- Liệt kê các file 0 byte để xem trước.
- Giới hạn phạm vi quét bằng
-maxdepthhoặc-name. - Xóa bằng
-delete, hoặc bằng-exec rmnếu bản find quá cũ. - Đếm lại để xác nhận đã sạch.
Các lệnh trong bài chạy được trên mọi bản Linux có GNU findutils: CentOS, AlmaLinux, Ubuntu, Debian. Ví dụ lấy thư mục /home/clienthost, bạn thay bằng đường dẫn của mình.
Vì sao file 0 byte làm đầy inode dù ổ đĩa còn trống
Mỗi file trên ext4 hay XFS chiếm một inode để lưu quyền, chủ sở hữu và vị trí dữ liệu, kể cả khi phần dữ liệu rỗng. Số inode được ấn định lúc format phân vùng và không tăng thêm được. Vì vậy một thư mục chứa hàng trăm nghìn file rỗng vẫn báo hết chỗ, trong khi df -h hiển thị dung lượng còn thừa.
Chạy df -i để nhìn đúng vấn đề. Cột IUse% gần 100% mà cột dung lượng còn trống là dấu hiệu chắc chắn. Trên máy chủ hosting, tình huống này hay đi kèm lỗi upload thất bại và website trắng trang, chi tiết ở bài xử lý lỗi full Inode trên server DirectAdmin.
Cách tìm file 0 byte bằng lệnh find
Lệnh find quét đệ quy từ đường dẫn bạn chỉ định, đi vào mọi thư mục con. Tùy chọn -size lọc theo kích thước, nhưng đơn vị mặc định là khối chứ không phải byte, nên phải thêm hậu tố c để tính đúng theo byte.
find /home/clienthost -size 0
Kết quả trả về danh sách đường dẫn đầy đủ:
/home/clienthost/log
/home/clienthost/test/logging.log
/home/clienthost/job.txt
Viết -size 0 là tìm file chiếm 0 khối, cách này bắt được cả file rỗng nhưng cách viết đúng nghĩa là:
find /home/clienthost -size 0c
Muốn biết có bao nhiêu file trước khi động tay, nối thêm wc -l:
find /home/clienthost -size 0c | wc -l
Nên xóa bằng -delete hay bằng -exec rm
Hai cách cho kết quả giống nhau. Tùy chọn -delete do chính find thực hiện nên nhanh hơn, không sinh tiến trình phụ. Tùy chọn -exec rm gọi lệnh rm cho từng file, chậm hơn nhưng chạy được trên các bản find đời cũ chưa có -delete.
| Tiêu chí | -delete | -exec rm |
|---|---|---|
| Tốc độ với 10.000 file | Vài giây | Chậm hơn nhiều lần |
| Tiến trình sinh thêm | Không | Một tiến trình mỗi file |
| Bản find cũ | Có thể không hỗ trợ | Luôn chạy được |
| Xóa được thư mục rỗng | Có, nếu bỏ điều kiện lọc file | Cần đổi sang rmdir |
| Nên dùng khi | Máy chủ đời mới, số file lớn | Hệ thống cũ hoặc cần chạy lệnh phức tạp |
Các bước xóa file 0 byte an toàn
Bốn bước dưới đây chạy qua SSH bằng tài khoản có quyền ghi vào thư mục cần dọn. Luôn liệt kê trước rồi mới xóa, vì find đi vào cả thư mục con và không hỏi lại lần nào.
1. Xem trước danh sách sẽ bị xóa
find /home/clienthost -size 0c
Đọc hết danh sách này. File cấu hình rỗng có chủ đích cũng nằm trong đó, ví dụ .gitkeep, index.html chặn liệt kê thư mục, hoặc file khóa của một tiến trình đang chạy. Xóa nhầm những file đó là hỏng ứng dụng.
2. Giới hạn phạm vi bằng -maxdepth
Mặc định find đi xuống mọi tầng thư mục con. Tùy chọn -maxdepth 1 giữ lệnh ở đúng thư mục gốc:
find /home/clienthost -maxdepth 1 -size 0c -delete
Kiểm lại thì file trong thư mục con vẫn còn:
find /home/clienthost -size 0c
/home/clienthost/test/logging.log
3. Lọc thêm theo tên file
Tùy chọn -name khoanh vùng theo mẫu tên. Lệnh dưới chỉ đụng tới file bắt đầu bằng log:
find /home/clienthost -maxdepth 1 -size 0c -name "log*" -delete
Đây là cách an toàn nhất khi dọn log rỗng, vì nó không chạm tới file dữ liệu.
4. Xóa bằng -exec khi find không có -delete
find /home/clienthost -maxdepth 1 -size 0c -exec rm '{}' \;
Chuỗi {} được thay bằng tên file tìm thấy. Đặt nó trong dấu nháy đơn để shell không hiểu cặp ngoặc nhọn thành cú pháp riêng. Dấu chấm phẩy cuối lệnh đánh dấu chỗ kết thúc phần lệnh của -exec, và cũng phải thoát bằng dấu chéo ngược hoặc nháy đơn.
5. Đếm lại sau khi xóa
find /home/clienthost -size 0c | wc -l
df -i /home
Xong đúng khi số đếm về 0 hoặc chỉ còn những file rỗng bạn cố ý giữ, và cột IUse% của df -i giảm xuống.
Thứ tự tùy chọn sai làm find xóa sạch thư mục
Đây là lỗi nguy hiểm nhất khi dùng find. Các tùy chọn được xử lý theo đúng thứ tự viết ra, nên nếu -delete đứng trước điều kiện lọc, find xóa mọi thứ nó gặp rồi mới xét tới điều kiện. Lệnh dưới đây xóa toàn bộ nội dung thư mục chứ không riêng file rỗng:
find /home/clienthost -delete -maxdepth 1 -size 0c
Quy tắc để không dẫm phải: điều kiện lọc luôn viết trước, hành động viết sau cùng. Với bản GNU find đời mới, đặt -maxdepth sau các điều kiện khác còn sinh cảnh báo warning: you have specified the global option -maxdepth after the argument. Gặp dòng này thì dừng lại và viết lại lệnh.
Lỗi hay gặp khi dọn file rỗng
Ba tình huống dưới đây chiếm phần lớn các ca dọn file 0 byte không ra kết quả. Mỗi tình huống có thông báo riêng nên nhìn dòng lỗi là biết rơi vào ca nào.
Permission denied ở nhiều thư mục. Tài khoản đang chạy không đọc được thư mục đó. Chạy lại bằng sudo, hoặc thêm 2>/dev/null để ẩn dòng lỗi nếu bạn chỉ cần dọn phần mình sở hữu.
Xóa rồi mà df -i vẫn cao. Inode chỉ được giải phóng khi không còn tiến trình nào giữ file. Chạy lsof +L1 để tìm file đã xóa mà vẫn bị mở, rồi khởi động lại dịch vụ đang giữ chúng.
Số file quá lớn làm lệnh treo. Với vài triệu file, dùng find ... -print0 | xargs -0 rm để gom nhiều file vào một lần gọi rm, hoặc chia nhỏ theo từng thư mục con.
Việc nên làm tiếp để inode không đầy lại
Dọn xong là hết triệu chứng, chưa hết nguyên nhân. File rỗng thường quay lại sau vài tuần nếu tiến trình sinh ra chúng vẫn chạy. Xem log của ứng dụng quanh mốc thời gian các file rỗng được tạo để tìm đúng thủ phạm.
Đặt một tác vụ định kỳ dọn file rỗng trong thư mục log là cách giữ ổn định lâu dài, cách viết lịch chạy có ở bài tìm hiểu Crontab trong Linux. Với máy chủ dùng bảng điều khiển, kỹ thuật BizMaC có thể kiểm tra giúp phân vùng nào sắp hết inode khi bạn gửi yêu cầu từ tài khoản dịch vụ đang dùng.
Bài khác trong Linux Server
Xem cả 22 bàiLàm theo vẫn chưa được?
Gửi yêu cầu hỗ trợ, kỹ thuật xem trực tiếp trên dịch vụ của Anh/Chị.