BizMaC bizmac.com

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.

  1. Liệt kê các file 0 byte để xem trước.
  2. Giới hạn phạm vi quét bằng -maxdepth hoặc -name.
  3. Xóa bằng -delete, hoặc bằng -exec rm nếu bản find quá cũ.
  4. Đế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 fileVài giâyChậm hơn nhiều lần
Tiến trình sinh thêmKhôngMộ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ỗngCó, nếu bỏ điều kiện lọc fileCần đổi sang rmdir
Nên dùng khiMáy chủ đời mới, số file lớnHệ 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.

Hướng dẫn này có giúp được Anh/Chị không?

Bài khác trong Linux Server

Xem cả 22 bài
Cài tường lửa UFW cơ bản cho VPS Ubuntu Cách cài UFW trên Ubuntu, cho phép cổng SSH trước khi bật, mở cổng web 80 và 443, rồi kích hoạt tường lửa mà không mất kết nối cho người mới quản trị VPS. 5 phút đọc 19 lượt xem Cập nhật 29/08/2026 Đổi port SSH mặc định để bảo mật VPS Cách đổi cổng SSH từ 22 sang cổng khác trong file sshd_config, mở cổng mới trên tường lửa trước khi khởi động lại dịch vụ, và kiểm tra kết nối cho người mới. 5 phút đọc 8 lượt xem Cập nhật 28/08/2026 Cài Fail2Ban chống dò mật khẩu SSH Cách cài Fail2Ban trên Ubuntu và CentOS, tạo file cấu hình jail.local, đặt số lần sai và thời gian khoá IP, rồi kiểm tra danh sách IP đang bị chặn. 5 phút đọc 9 lượt xem Cập nhật 28/08/2026 Phân quyền file thư mục bằng chmod và chown Cách đọc dãy quyền rwx, dùng chmod đổi quyền theo số và chown đổi chủ sở hữu file trên Linux, kèm bảng số quyền hay dùng và cảnh báo chmod 777. 5 phút đọc 3 lượt xem Cập nhật 27/08/2026 15 lệnh Linux cơ bản cho người mới quản trị VPS Bảng tra 15 lệnh Linux thiết yếu để đi lại trong thư mục, xem và sửa file, kiểm tra tài nguyên và quản lý dịch vụ trên VPS, kèm ví dụ cho người mới. 5 phút đọc 4 lượt xem Cập nhật 26/08/2026 Kết nối VPS Linux bằng SSH với PuTTY Cách tải PuTTY, nhập IP và cổng, lưu session để lần sau vào nhanh, và đăng nhập VPS Linux lần đầu bằng tài khoản root cho người mới quản trị. 7 phút đọc 3 lượt xem Cập nhật 25/08/2026

Là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ị.

Gửi yêu cầu hỗ trợ