Lệnh find — Tìm kiếm tệp tin mạnh mẽ
Lệnh find là công cụ tiêu chuẩn để tìm tệp/thư mục trong hệ thống tệp Linux. Nó duyệt đệ quy cây thư mục và lọc theo nhiều tiêu chí: tên, kích thước, thời gian, quyền, loại...
Cú pháp cơ bản
find [đường_đích_bắt_đầu] [biểu_thức_điều_kiện] [tên_tệp]
Mặc định tìm từ thư mục hiện tại. Các shortcut vị trí:
.— Thư mục hiện tại và thư mục con./— Toàn bộ hệ thống tệp (cầnsudođể tránh lỗi permission).~— Thư mục home của user hiện tại.
Mẹo: Mở terminal nhanh: Ctrl+Alt+T (trên hầu hết DE).
Các biểu thức (Expressions) thường dùng
Biểu thức phổ biến nhất: -name "tên_tệp" (tìm theo tên chính xác, phân biệt chữ hoa/thường).
Tìm theo tên (case-insensitive): -iname
find /home/user -iname "*.pdf"
Tìm theo loại (type)
-type f— Chỉ tệp thường (file).-type d— Chỉ thư mục (directory).-type l— Chỉ symbolic link.
Tìm theo thời gian
| Biểu thức | Ý nghĩa |
|---|---|
-atime n | Truy cập cuối cách đây n ngày (+n > n ngày, -n < n ngày). |
-mtime n | Nội dung sửa đổi cuối cách đây n ngày. |
-ctime n | Metadata/thông tin inode thay đổi cuối cách đây n ngày. |
-amin n | Truy cập cuối cách đây n phút. |
-mmin n | Sửa đổi nội dung cuối cách đây n phút. |
-cmin n | Thay đổi metadata cuối cách đây n phút. |
Tìm theo kích thước
-size +100M— Lớn hơn 100 MB.-size -50k— Nhỏ hơn 50 KB.-size 10M— Bằng đúng 10 MB.
Đơn vị: c (byte), k (KiB), M (MiB), G (GiB).
Tìm theo quyền sở hữu & quyền truy cập
-user tên_user/-uid số— Chủ sở hữu.-group tên_group/-gid số— Nhóm.-perm 644— Quyền chính xác.-perm -u=rw— Ít nhất có quyền đọc/ghi cho owner.-readable,-writable,-executable— Được đọc/ghi/thực thi bởi user hiện tại.
Khác
-empty— Tệp/thư mục rỗng.-name "pattern"— Khớp tên (dùng wildcard*,?).-path "pattern"— Khớp đường dẫn.-regex "pattern"— Khớp regex.-links n— Số hard link = n.-inum n— Inode number = n.
Ví dụ thực tế
1. Tìm tệp truy cập > 100 ngày trước trong thư mục home
find ~ -type f -atime +100
2. Tìm tất cả tệp và thư mục rỗng trên toàn hệ thống
find / -empty
3. Tìm tất cả tệp thực thi (executable)
find / -type f -executable
4. Tìm tất cả tệp có quyền đọc cho user hiện tại
find / -type f -readable
5. Tìm tệp .log lớn hơn 50MB trong /var/log
find /var/log -name "*.log" -size +50M
6. Tìm tệp sửa đổi trong 7 ngày qua
find /home/user -type f -mtime -7
Sử dụng Pattern (mẫu) tìm kiếm
Dùng wildcard *, ? với -name hoặc -iname:
find / -name "*.mp3"
Lưu ý: Tùy shell, có thể cần escape dấu * hoặc bọc pattern trong ngoặc đơn:
find / -name '*.mp3'
Xuất kết quả ra tệp
Kết quả quá nhiều? Chuyển hướng (redirect) hoặc pipe:
find / -name "*.log" > ~/log_files.txt
find / -name "*.tmp" | head -20
find / -name "*.bak" | tee ~/bak_files.txt
Tìm và thực thi lệnh trên kết quả (-exec)
Cú pháp: find ... -exec lệnh {} \; (dấu {} thay thế bằng đường dẫn tệp tìm được).
Ví dụ: Tìm và chỉnh sửa tệp bằng nano
find /home/user -name "config.ini" -exec nano {} \;
Ví dụ: Tìm và xóa tệp .tmp cũ hơn 30 ngày
find /tmp -name "*.tmp" -mtime +30 -exec rm {} \;
Ví dụ: Tìm và nén tất cả .log thành .gz
find /var/log -name "*.log" -exec gzip {} \;
Lưu ý hiệu năng: Dùng -exec ... + (kết thúc bằng + thay vì \;) để gom nhiều tệp vào một lệnh thực thi — nhanh hơn đáng kể.
find /var/log -name "*.log" -exec gzip {} +