Lệnh find trong shell Linux cho phép tìm file trong hệ thống file. Có thể tìm theo tên, quyền user, kích thước. Lệnh find cũng có thể thực hiện hành động trên các file tìm được.
Cú pháp lệnh Find
Cú pháp lệnh find như sau:
find [TUY_CHON] [DUONG_DAN] [BIEU_THUC]
Trong đó:
- [TUY_CHON] là các tùy chọn từ bảng dưới xác định hành vi find
- [DUONG_DAN] là điểm bắt đầu tìm kiếm
- [BIEU_THUC] định nghĩa điều kiện tìm file khớp và hành động trên file tìm được
Tùy chọn
Các TUY_CHON thường dùng cho lệnh find, từ manual:
| Tùy chọn | Mô tả |
|---|---|
| -P | Không bao giờ theo symbolic link. Hành vi mặc định |
| -L | Theo symbolic link. Khi find kiểm tra/in thông tin file, dùng thuộc tính file được trỏ tới, không phải link |
| -H | Không theo symbolic link, trừ khi xử lý tham số dòng lệnh |
Biểu thức (Expressions)
Một số câu lệnh thường dùng từ manual find để xây dựng BIEU_THUC, kiểm tra file khớp và tùy chọn hành động:
| Điều kiện tìm kiếm (Tests) | Mô tả |
|---|---|
| -empty | Tìm file rỗng |
| -executable | Khớp file thực thi được và thư mục searchable |
| -group ten | File thuộc group có tên ten |
| -mtime n | Dữ liệu file sửa đổi lần cuối nhỏ hơn, lớn hơn, hoặc đúng n*24 giờ trước |
| -name pattern | Tên cơ sở file (bỏ thư mục cha) khớp pattern pattern |
| -path pattern | Đường dẫn file khớp pattern pattern |
| -readable | Khớp file đọc được bởi user hiện tại |
| -size n | File dùng nhỏ hơn, lớn hơn hoặc đúng n đơn vị, làm tròn lên (xem bảng đơn vị dưới) |
| -type c | File loại c (xem bảng giá trị c dưới) |
| -user ten | File sở hữu bởi user ten |
| Hành động (Actions) | Mô tả |
|---|---|
| In tên file (hành động mặc định) | |
| -prune | Nếu file là thư mục, không đi sâu vào bên trong |
| -depth | Xử lý nội dung thư mục trước thư mục đó |
| -delete | Xóa file khớp. -delete cũng như tùy chọn (vì ngụ ý -depth) |
| -exec lenh | Thực thi lenh |
| -execdir lenh | Giống -exec nhưng chạy lệnh từ thư mục con chứa file khớp |
| -ok lenh | Giống -exec nhưng hỏi user trước |
| -okdir lenh | Giống -execdir nhưng hỏi user trước |
| -printf format | In chi tiết file theo format |
Toán tử trong biểu thức
Toán tử dùng để nối các mục trong biểu thức:
| Toán tử | Ý nghĩa |
|---|---|
| -o | OR |
| -a | AND (toán tử mặc định giữa các biểu thức nếu không cung cấp toán tử) |
Để xem đầy đủ tùy chọn và biểu thức, chạy:
man find
Ví dụ lệnh Find
Tùy chọn, biểu thức, hành động có thể kết hợp tạo thao tác find đơn giản liệt kê file khớp hoặc phức tạp tìm theo điều kiện phức hợp và hành động. Xem ví dụ:
Tìm file theo tên
Ví dụ tìm tất cả file tên myfile trong thư mục /home/screw:
find /home/screw -name myfile
Tìm theo loại
Lệnh trên trả về tất cả file khớp – kể cả thư mục, link, device – mọi thứ trong filesystem.
Biểu thức -type f giới hạn tìm chỉ file thường. Tìm file tên myfile:
find /home/screw -type f -name myfile
Hoặc chỉ tìm thư mục:
find /home/screw -type d -name myfile
Các loại có sẵn:
| Loại | Ý nghĩa |
|---|---|
| b | Block (buffered) special |
| c | Character (unbuffered) special |
| d | Directory |
| p | Named pipe (FIFO) |
| f | Regular file |
| l | Symbolic link; không bao giờ true nếu -L hoặc -follow có hiệu lực, trừ khi link hỏng |
| s | Socket |
Phân biệt chữ hoa/thường
Tùy chọn -name phân biệt chữ hoa/thường – để tìm không phân biệt dùng -iname:
find /home/screw -iname mYFiLe
Tìm file theo đuôi mở rộng dùng Wildcard & Regex
Dùng wildcard (*) trong tên file, cho phép tìm theo đuôi:
find -L /home/screw -name '*.pdf'
Tìm tất cả file đuôi .pdf. Pattern có chứa regex.
Loại trừ file theo tên hoặc đuôi
Toán tử -not loại trừ file theo tên/pattern, trả về kết quả không khớp:
find /home/screw -type f -not -name '*.pdf'
Loại trừ toàn bộ thư mục khỏi kết quả
Dùng -prune loại trừ path khớp và nội dung. Ví dụ loại trừ /home/screw/junk:
find /home/screw -path /home/screw/junk -prune -o -print
Tìm file theo kích thước
Tìm tất cả file nhỏ hơn 500 KB:
find /home/screw -type f -size -500k
Tìm file từ 100 đến 200 KB với 2 điều kiện size:
find /home/screw -type f -size +100k -size -200k
Đơn vị tìm theo kích thước:
| Đơn vị | Ý nghĩa |
|---|---|
| b | Khối 512-byte (mặc định nếu không có hậu tố) |
| c | Byte |
| w | Từ 2-byte |
| k | Kibibyte (KiB, 1024 byte) |
| M | Mebibyte (MiB, 1024*1024 = 1048576 byte) |
| G | Gibibyte (GiB, 1024*1024*1024 = 1073741824 byte) |
Ngày sửa đổi hoặc truy cập
Tìm tất cả file .txt sửa đổi trong 14 ngày qua:
find /home/screw -name '*.txt' -mtime 14
Tìm theo lần truy cập thay vì sửa đổi, dùng -atime thay -mtime.
Thêm dấu (+ hoặc –) để tìm file sửa đổi lớn hơn hoặc nhỏ hơn khoảng thời gian – ví dụ file sửa đổi > 14 ngày trước:
find /home/screw -name '*.txt' -mtime +14
Dùng phút thay vì ngày, thay -mmin -amin cho -mtime -atime.
Nhiều tùy chọn khác trong manual, chạy:
man find
User/Group sở hữu
Tìm file sở hữu bởi root trong /home/screw:
find /home/screw -user root
Quyền (Permissions)
Tìm file có quyền đọc/viết toàn cục (777):
find /home/screw -perm 777
Xem bài về lệnh chmod.
Kết hợp nhiều điều kiện
Bất kỳ tổ hợp biểu thức nào cũng dùng được. Nếu không có toán tử giữa chúng, mặc định cả hai phải khớp (toán tử AND mặc định).
Ví dụ tìm file text tạo 14 ngày qua nhỏ hơn 500kb:
find /home/screw -name '*.txt' -mtime 14 -type f -size -500k
Hành động trên file tìm được
Mặc định find in kết quả (tương tự gọi -print).
find /home/screw -name myfile -print
Tùy chỉnh định dạng kết quả
Tùy chỉnh output thêm thông tin file tìm được. Ví dụ in tên file, gạch ngang, kích thước byte:
find /home/screw -name '*.txt' -printf '%f - %s bytes'
Nhiều biến để tùy chỉnh output, từ kích thước đến trường ngày giờ riêng lẻ – xem manual để biết danh sách đầy đủ.
Ghi kết quả ra file
find /home/screw -name myfile > find_results.txt
Xóa file
Hành động -delete xóa file khớp (không xác nhận, cẩn thận!):
find /home/screw -name '*.junk' -delete
Thực thi lệnh với -exec / -execdir
Chạy lệnh shell bất kỳ trên từng kết quả find dùng -exec:
find /home/screw -name '*.txt' -exec ls -la {} '\;' -exec chạy lệnh từ thư mục làm việc hiện tại. Để chạy từ vị trí file tìm được, dùng -execdir:
find /home/screw -name '*.txt' -execdir ls -la {} '\;' Trong 2 ví dụ, ls -la chạy trên từng kết quả. Dấu ngoặc nhọn {} thay bằng kết quả find, ';' kết thúc tham số lệnh ls để find biết hết.
Hỏi xác nhận với -ok / -okdir
-ok giống -exec nhưng hỏi trước khi chạy. Hữu ích nếu muốn xóa nhưng hỏi trước mỗi file:
find /home/screw -name '*.txt' -ok rm {} '\;' -okdir cũng hỏi nhưng chạy từ vị trí file tìm được:
find /home/screw -name '*.txt' -okdir rm {} '\;'