Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm chủ lệnh find Linux: Ví dụ thực tế & Hướng dẫn cú pháp

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ả
-print 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 {} '\;'