Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Tìm lệnh trong Linux [Với các ví dụ hữu ích]

Tìm thấy lệnh trong Linux shell cho phép bạn tìm kiếm các tệp trong hệ thống tệp. Nó có thể tìm các tệp theo tên, quyền của người dùng và kích thước. Tìm thấy lệnh cũng có thể thực hiện các hành động trên các tệp được tìm thấy.

Tìm cú pháp lệnh

Cú pháp cho find lệnh như sau:

find [OPTIONS] [PATH] [EXPRESSION]

Ở đâu:

  • [TÙY CHỌN] là các tùy chọn từ bảng bên dưới để xác định hành vi tìm kiếm
  • [PATH] là điểm bắt đầu cho việc tìm kiếm
  • [EXPRESSION] xác định các bài kiểm tra để tìm các tệp phù hợp và bất kỳ hành động nào cần thực hiện đối với các tệp được tìm thấy

Tùy chọn

Dưới đây là các TÙY CHỌN thường được sử dụng cho tìm thấy lệnh, được điều chỉnh từ sách hướng dẫn:

-P Không bao giờ đi theo các liên kết tượng trưng. Đây là hành vi mặc định
-L Theo các liên kết tượng trưng. Khi tìm kiếm kiểm tra hoặc in thông tin về tệp, thông tin được sử dụng sẽ được lấy từ các thuộc tính của tệp mà liên kết trỏ đến, không phải từ chính liên kết
-H Không đi theo các liên kết tượng trưng, ​​ngoại trừ khi đang xử lý các đối số dòng lệnh

Biểu thức

Một số tuyên bố phổ biến sau đây từ find có thể được sử dụng để tạo EXPRESSION, kiểm tra các tệp phù hợp và tùy chọn thực hiện các hành động trên chúng:

Kiểm tra (Điều kiện tìm kiếm)
-empty Tìm tệp trống
-executable Đối sánh các tệp là thư mục thực thi và có thể tìm kiếm được
-nhóm tên Tệp thuộc nhóm có tên
-mtime n Dữ liệu tệp được sửa đổi lần cuối ít hơn, nhiều hơn hoặc chính xác là n * 24 giờ trước
-name pattern Cơ sở của tên tệp (đường dẫn đã xóa các thư mục hàng đầu) khớp với mẫu mẫu
-mẫu đường dẫn Đường dẫn tệp khớp với mẫu mẫu
-đọc được Đối sánh các tệp mà người dùng hiện tại có thể đọc được
-kích thước n Tệp sử dụng ít hơn, nhiều hơn hoặc chính xác n đơn vị dung lượng, làm tròn (Xem bảng bên dưới để biết các đơn vị khả dụng)
-type c Tệp thuộc loại c (Xem bảng bên dưới để biết các giá trị cho c )
-tên người dùng Tệp được sở hữu bởi name người dùng
Hành động
-print Xuất ra tên của tệp (Hành động mặc định)
-prune Nếu tệp là một thư mục, không chuyển xuống nó
-depth Xử lý nội dung của từng thư mục trước chính thư mục đó
-delete Xóa các tệp phù hợp. Hành động -delete cũng hoạt động giống như một tùy chọn (vì nó ngụ ý -depth)
-exec command Thực hiện lệnh
-execdir command Giống như -exec, nhưng lệnh đã chỉ định được chạy từ thư mục con chứa tệp phù hợp
-ok lệnh Giống như -exec nhưng hãy hỏi người dùng trước.
-okdir command Giống như -execdir nhưng hỏi người dùng trước theo cách tương tự như đối với -ok.
-printf định dạng In chi tiết tệp ở định dạng

Các toán tử trong Biểu thức

Các toán tử có thể được sử dụng để xâu chuỗi các mục lại với nhau trong một biểu thức:

-o HOẶC
-a AND (Toán tử mặc định giữa các biểu thức khi không có toán tử nào được cung cấp

Để có danh sách đầy đủ các tùy chọn và biểu thức để tìm tệp, bạn có thể chạy như sau:

man find

Tìm ví dụ về lệnh

Các tùy chọn, biểu thức và hành động có thể được kết hợp để tạo các hoạt động tìm kiếm đơn giản để liệt kê các tệp phù hợp hoặc các hoạt động phức tạp có thể tìm tệp theo các điều kiện phức tạp và thực hiện một hành động. Xem bên dưới để biết các ví dụ:

Tìm tệp theo tên tệp

Ví dụ này tìm tất cả các tệp có tên myfile trong thư mục / home / vít :

find /home/screw -name myfile

Tìm kiếm theo loại

Lệnh trên sẽ trả về tất cả các tệp phù hợp - bao gồm thư mục, liên kết và thiết bị - mọi thứ trong hệ thống tệp.

-type f biểu thức giới hạn tìm kiếm trong tệp chỉ có. Để tìm kiếm các tệp có tên myfile :

find /home/screw  -type f -name myfile

Hoặc, chỉ tìm kiếm các thư mục:

find /home/screw  -type d -name myfile

Các loại có sẵn là:

b Khối (đệm) đặc biệt
c Ký tự (không có bộ đệm) đặc biệt
d Thư mục
p Đường ống được đặt tên (FIFO)
f Tệp thông thường
l Liên kết tượng trưng; điều này không bao giờ đúng nếu tùy chọn -L hoặc tùy chọn -follow có hiệu lực, trừ khi liên kết tượng trưng bị hỏng
s Ổ cắm

Phân biệt chữ hoa chữ thường

-tên tùy chọn phân biệt chữ hoa chữ thường - để tìm kiếm không phân biệt chữ hoa chữ thường, hãy sử dụng -iname :

find /home/screw -iname mYFiLe

Tìm tệp theo tiện ích mở rộng Sử dụng ký tự đại diện &Regex

Bạn có thể sử dụng ký tự đại diện ( * ) trong tên tệp, cho phép bạn tìm kiếm theo đuôi tệp:

find -L /home/screw -name '*.pdf'

Ở trên sẽ tìm kiếm tất cả các tệp bằng .pdf sự mở rộng. Mẫu tìm kiếm được trích dẫn có thể chứa regex.

Bỏ qua tệp theo tên hoặc phần mở rộng

-không phải toán tử có thể được sử dụng để bỏ qua các tệp theo tên hoặc mẫu, trả về tất cả các kết quả không khớp:

find /home/screw -type f -not -name '*.pdf'

Bỏ qua Toàn bộ Thư mục khỏi Kết quả

Sử dụng -prune tùy chọn để bỏ qua các đường dẫn phù hợp và nội dung của chúng. Ví dụ dưới đây sẽ bỏ qua / home / vít / rác thư mục từ kết quả:

find /home/screw -path /home/screw/junk -prune -o -print

Tìm kiếm tệp theo kích thước

Ví dụ này tìm kiếm tất cả các tệp nhỏ hơn 500 Kilobyte:

find /home/screw -type f -size -500k

Cái này sẽ tìm các tệp từ 100 đến 200 Kilobyte bằng cách chuyển hai điều kiện kích thước:

find /home/screw -type f -size +100k -size -200k

Các đơn vị có sẵn để tìm kiếm theo kích thước là:

b Khối 512 byte (đây là mặc định nếu không có hậu tố nào được sử dụng)
c byte
w Từ hai byte
k Kibibyte (KiB, đơn vị 1024 byte)
M Mebibyte (MiB, đơn vị 1024 * 1024 =1048576 byte)
G Gibibyte (GiB, đơn vị 1024 * 1024 * 1024 =1073741824 byte)

Ngày sửa đổi hoặc truy cập

Ví dụ sau tìm thấy tất cả .txt các tệp được sửa đổi trong 14 ngày qua:

find /home/screw -name '*.txt' -mtime 14

Để tìm kiếm theo lần truy cập cuối cùng thay vì sửa đổi ngày, sử dụng -atime tùy chọn thay vì -mtime .

Bạn cũng có thể thêm dấu ( + hoặc - ) để tìm kiếm các tệp được sửa đổi lớn hơn hoặc ít hơn khoảng thời gian nhất định - ví dụ này sẽ trả về các tệp đã được sửa đổi cách đây hơn 14 ngày.

find /home/screw -name '*.txt' -mtime +14

Để sử dụng phút thay vì ngày làm đơn vị thời gian, bạn có thể thay thế -mmin -amin thay vì -mtime -atime .

Như thường lệ, có rất nhiều tùy chọn để trộn và kết hợp, tất cả đều có trong sách hướng dẫn, có sẵn bằng cách chạy:

man find

Người dùng / Nhóm chủ sở hữu

Để tìm tất cả các tệp do root sở hữu trong / home / vít thư mục, chạy:

find /home/screw -user root

Quyền

Lệnh sau sẽ tìm tất cả các tệp có quyền đọc / ghi chung:

find /home/screw -perm 777

Xem bài viết của chúng tôi trên chmod lệnh và chức năng của nó.

Kết hợp

Có thể sử dụng bất kỳ tổ hợp biểu thức tìm kiếm nào. Nếu không có toán tử nào được bao gồm giữa chúng, sẽ được giả định rằng cả hai điều kiện phải được đáp ứng để tệp trùng khớp (tức là toán tử AND là mặc định).

Ví dụ này tìm kiếm tất cả các tệp văn bản được tạo trong 14 ngày qua dưới 500kb:

find /home/screw -name '*.txt' -mtime 14 -type f -size -500k

Hành động trên tệp tìm thấy

Theo mặc định, lệnh find sẽ in kết quả thao tác tìm (giống như cách gọi -print hành động).

find /home/screw -name myfile -print

Tùy chỉnh định dạng kết quả

Bạn có thể tùy chỉnh đầu ra của kết quả để bao gồm thông tin bổ sung về bất kỳ tệp nào được tìm thấy. Ví dụ này in tên tệp, theo sau là dấu gạch ngang, theo sau là kích thước của tệp theo byte:

find /home/screw -name '*.txt' -printf '%f - %s bytes'

Nhiều biến có thể được sử dụng để tùy chỉnh đầu ra, từ kích thước tệp đến các trường ngày riêng lẻ để sửa đổi tệp và thời gian truy cập - hãy xem hướng dẫn sử dụng để biết danh sách đầy đủ.

Ghi kết quả vào tệp

Chuyển hướng kết quả của tìm thấy của bạn thao tác với tệp văn bản:

find /home/screw -name myfile > find_results.txt

Đang xóa

-Xóa hành động sẽ xóa các tệp phù hợp (mà không cần xác nhận, vì vậy hãy cẩn thận!):

find /home/screw -name '*.junk' -delete

Thực thi các lệnh với -exec / * -execdir *

Bạn có thể thực thi bất kỳ lệnh shell nào đối với mỗi find kết quả bằng cách sử dụng -exec hành động:

find /home/screw -name '*.txt' -exec ls -la {} ';'

-exec sẽ thực hiện lệnh từ thư mục làm việc hiện tại. Để thực hiện lệnh từ vị trí của tệp được tìm thấy, hãy sử dụng -execdir thay vào đó:

find /home/screw -name '*.txt' -execdir ls -la {} ';'

Trong hai ví dụ trên, ls -la được chạy dựa trên mỗi kết quả. Dấu ngoặc nhọn {} sẽ được thay thế bằng kết quả lệnh find và ‘;’ chấm dứt đối số dòng lệnh cho ls lệnh để tìm thấy biết chúng kết thúc ở đâu.

Nhắc xác nhận với -ok / -okdir

The -ok hành động hoạt động giống như -exec nhưng nó hỏi bạn trước khi chạy lệnh đã cho. Điều này rất hữu ích nếu bạn muốn xóa tệp, nhưng hãy hỏi trước khi xóa từng tệp:

find /home/screw -name '*.txt' -ok rm {} ';'

-okdir cũng nhắc nhưng thực hiện lệnh từ vị trí của tệp tìm thấy:

find /home/screw -name '*.txt' -okdir rm {} ';'