Sử dụng lệnh Linux và Unix: tìm

Lệnh LinuxUnix tìm thấy thực hiện tìm kiếm các tệp trong hệ thống phân cấp thư mục.

Cú pháp cho lệnh find :

tìm [đường dẫn ...] [biểu thức]

Sự miêu tả

Trang hướng dẫn này tài liệu phiên bản tìm kiếm GNU. Lệnh tìm tìm cây thư mục bắt nguồn từ mỗi tên tệp đã cho bằng cách đánh giá biểu thức đã cho từ trái sang phải, theo các quy tắc ưu tiên (xem phần Các toán tử bên dưới), cho đến khi kết quả được biết; nói cách khác, phía bên tay trái là sai hoạt động, đúng cho hoặc , tại thời điểm đó tìm chuyển sang tên tệp tiếp theo.

Đối số đầu tiên bắt đầu bằng:

được lấy làm khởi đầu của biểu thức; bất kỳ đối số nào trước đó là đường dẫn tìm kiếm và bất kỳ đối số nào sau đó là phần còn lại của biểu thức. Nếu không có đường dẫn nào được cung cấp, thư mục hiện tại sẽ được sử dụng. Nếu không có biểu thức nào được đưa ra, thì biểu thức- dấu được sử dụng.

Lệnh find thoát với trạng thái 0 nếu tất cả các tệp được xử lý thành công, lớn hơn 0 nếu xảy ra lỗi.

Biểu thức

Biểu thức được tạo thành từ các tùy chọn (ảnh hưởng đến hoạt động tổng thể hơn là xử lý một tệp cụ thể và luôn trả về đúng), các phép thử (trả về giá trị đúng hoặc sai) và các hành động (có tác dụng phụ và trả về true hoặc giá trị sai), tất cả được phân tách bởi toán tử. Biểu thức được giả định khi toán tử bị bỏ qua. Nếu biểu thức không chứa các hành động nào khác ngoài -prune , thì -print được thực hiện trên tất cả các tệp mà biểu thức là đúng.

Tùy chọn

Tất cả các tùy chọn luôn trả về true. Chúng luôn luôn có hiệu lực, thay vì được xử lý chỉ khi vị trí của chúng trong biểu thức đạt được. Do đó, để rõ ràng, tốt nhất là đặt chúng vào đầu biểu thức.

- ngày đầu tiên Đo thời gian (cho -amin, -atime, -cmin, -ctime, -mmin-mtime ) từ đầu ngày hôm nay thay vì từ 24 giờ trước.
-dep Xử lý nội dung của mỗi thư mục trước chính thư mục đó.
-theo Liên kết tượng trưng cho Dereference. Implies -noleaf .
-help hoặc --help In tóm tắt việc sử dụng lệnh tìm và thoát.
-maxdepth [number] Giảm tối đa số lượng các cấp (một số nguyên không âm) của các thư mục bên dưới các đối số dòng lệnh. Biểu thức -maxdepth 0 có nghĩa là chỉ áp dụng các phép thử và hành động cho các đối số dòng lệnh.
-mindepth [number] Không áp dụng bất kỳ thử nghiệm hoặc hành động nào ở các mức thấp hơn số (số nguyên không âm). Biểu thức -mindepth 1 có nghĩa là xử lý tất cả các tệp ngoại trừ các đối số dòng lệnh.
-mount Không hạ xuống các thư mục trên các hệ thống tệp khác. Tên thay thế cho -xdev , để tương thích với một số phiên bản tìm khác .
-nôt Không tối ưu hóa bằng cách giả sử rằng các thư mục chứa ít hơn 2 thư mục con hơn số liên kết cứng của chúng. *
-trả lời hoặc đảo ngược In số phiên bản tìm kiếm và thoát.
-xdev Không hạ xuống các thư mục trên các hệ thống tệp khác.

* Tùy chọn này là cần thiết khi tìm kiếm các hệ thống tập tin không tuân theo quy ước liên kết thư mục Unix, chẳng hạn như các hệ thống tệp CD-ROM hoặc MS-DOS hoặc các điểm gắn kết khối AFS. Mỗi thư mục trên một hệ thống tập tin Unix bình thường có ít nhất 2 liên kết cứng: tên của nó và của nó . (kỳ) nhập cảnh. Ngoài ra, các thư mục con của nó (nếu có) có một mục nhập .. được liên kết với thư mục đó.

Khi tìm được một thư mục, sau khi nó đã đánh bại hai thư mục con ít hơn số liên kết của thư mục, nó biết rằng phần còn lại của các mục trong thư mục là các thư mục (các tệp trong cây thư mục). Nếu chỉ các tên của các tập tin cần được kiểm tra, không cần phải chỉ định chúng; điều này giúp tăng đáng kể tốc độ tìm kiếm.

Kiểm tra

Đối số bằng số có thể được chỉ định là:

+ n Lớn hơn n.
-n Đối với ít hơn n.
n Đối với chính xác n.
-amin n Tệp được truy cập lần cuối n phút trước.
-an hơn [tệp] Tệp được truy cập lần cuối gần đây hơn tệp đã được sửa đổi. -anewer bị ảnh hưởng bởi -follow chỉ khi -follow đến trước -anewer trên dòng lệnh.
-kịp thời n Tệp được truy cập lần cuối n * 24 giờ trước.
-cây n Trạng thái của tệp đã được thay đổi lần cuối n phút trước.
-công cụ Trạng thái của tệp đã được thay đổi gần đây nhất so với tệp đã được sửa đổi.
- cnewer bị ảnh hưởng bởi -follow chỉ khi -follow đến trước khi -cnewer trên dòng lệnh.
-cần n Trạng thái của tệp đã được thay đổi lần cuối n * 24 giờ trước.
-trống Tệp trống và là một tệp thông thường hoặc một thư mục.
-sai Luôn luôn sai.
-loại [loại] Tệp nằm trên hệ thống tệp thuộc loại được chỉ định. Các loại hệ thống tập tin hợp lệ khác nhau giữa các phiên bản Unix khác nhau; một danh sách không đầy đủ của các loại hệ thống tập tin được chấp nhận trên một số phiên bản của Unix hoặc khác là: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K. Bạn có thể sử dụng -printf với chỉ thị% F để xem các loại hệ thống tệp của bạn.
-gid n ID nhóm số của tệp là n .
-nhóm [gname] Tệp thuộc về nhóm gname (ID nhóm số được cho phép).
- tên [mẫu] Giống như -lname, nhưng trận đấu không phân biệt chữ hoa chữ thường.
-tên [mẫu] Giống như tên, nhưng trận đấu không phân biệt chữ hoa chữ thường. Ví dụ, các mẫu cho *F ?? khớp với tên tệp Foo , FOO , foo , fOo , v.v.
-trong n Tệp có số inode n .
- toàn bộ [mẫu] Giống như -path , nhưng trận đấu không phân biệt chữ hoa chữ thường.
-kiểu [full] Giống như -regex, nhưng trận đấu không phân biệt chữ hoa chữ thường.
-nút n Tệp có n liên kết.
-lệnh [mẫu] Tệp là một liên kết tượng trưng có nội dung phù hợp với mẫu vỏ. Các siêu ký tự không điều trị / hoặc . đặc biệt.
-mmin n Dữ liệu của tệp đã được sửa đổi lần cuối n phút trước.
-mtime n Dữ liệu của tệp đã được sửa đổi lần cuối n * 24 giờ trước.
- tên [mẫu] Cơ sở của tên tệp (đường dẫn có các thư mục hàng đầu bị xoá) khớp với mẫu vỏ. Các siêu ký tự ( * , ? , Và [] ) không khớp với a . ở đầu tên cơ sở. Để bỏ qua một thư mục và các tệp trong thư mục đó, hãy sử dụng -prune ; xem ví dụ trong phần mô tả về -path .
-nút hơn [tệp] Tệp đã được sửa đổi gần đây hơn tệp . Biểu thức -newer bị ảnh hưởng bởi -follow chỉ khi -follow đến trước -newer trên dòng lệnh.
-nouser Không có người dùng nào tương ứng với ID người dùng số của tệp.
-nogroup Không có nhóm nào tương ứng với ID nhóm số của tệp.
-đường dẫn Tên tệp khớp với mẫu hình vỏ. Các siêu ký tự không điều trị / hoặc . đặc biệt; vì vậy, ví dụ, tìm. -path './sr*sc sẽ in một mục nhập cho một thư mục có tên ./src/misc (nếu có). Để bỏ qua toàn bộ cây thư mục, hãy sử dụng -prune thay vì kiểm tra mọi tệp trong cây. Ví dụ, để bỏ qua thư mục src / emacs và tất cả các tệp và thư mục bên dưới nó, và in tên của các tệp khác được tìm thấy, hãy làm một cái gì đó như thế này: tìm. -path './src/emacs' -prune -o -print
-quảng cáo Các bit cho phép của tệp chính xác là [chế độ] (bát phân hoặc ký hiệu). Các chế độ tượng trưng sử dụng chế độ 0 làm điểm khởi hành.
-perm -ode Tất cả các bit quyền [chế độ] được đặt cho tệp.
chế độ -perm + Bất kỳ bit quyền nào [chế độ] được đặt cho tệp.
-regex [pattern] Tên tệp khớp với mẫu biểu thức chính quy. Đây là một trận đấu trên toàn bộ con đường, không phải là một tìm kiếm. Ví dụ: để khớp với tệp có tên ./fubar3, bạn có thể sử dụng biểu thức chính quy . * Bar. hoặc . * b. * 3 , nhưng không phải b. * r3 .
-size n [bckw] Tệp sử dụng n đơn vị không gian. Các đơn vị là các khối 512 byte theo mặc định hoặc nếu b theo n , byte nếu c theo n , kilobyte nếu k theo n , hoặc 2 byte nếu w sau n . Kích thước không tính khối gián tiếp, nhưng nó đếm số khối trong tệp thưa thớt mà không thực sự được phân bổ.
-thật Luôn luôn đúng.
-loại c Tệp thuộc loại c :
b Block (đệm) đặc biệt
c Ký tự (không bị cản trở) đặc biệt
d Danh mục
p Tên được đặt tên (FIFO)
f Tệp thông thường
l Liên kết tượng trưng
S Ổ cắm
D cửa (Solaris)
-nếu n ID người dùng số của tệp là n .
-sử dụng n Tệp được truy cập lần cuối n ngày sau khi trạng thái của nó được thay đổi lần cuối.
-user uname Tệp được sở hữu bởi người dùng uname (số ID người dùng được phép).
-xtype c Giống như loại trừ khi tệp là một liên kết tượng trưng. Đối với các liên kết tượng trưng: nếu -follow chưa được cung cấp, đúng nếu tệp là một liên kết đến tệp thuộc loại c ; nếu -follow đã được đưa ra, true nếu c là l. Nói cách khác, đối với các liên kết tượng trưng,
-xtype kiểm tra loại tệp mà loại không kiểm tra.

Hành động

lệnh -exec;

Thực hiện lệnh ; đúng nếu 0 trạng thái được trả về. Tất cả các đối số sau đây để tìm được lấy là đối số cho lệnh cho đến khi một đối số bao gồm `; ' gặp phải. Chuỗi `{} 'được thay thế bằng tên tệp hiện tại đang được xử lý ở mọi nơi nó xuất hiện trong các đối số cho lệnh, không chỉ trong các đối số mà nó ở một mình, như trong một số phiên bản tìm kiếm . Cả hai công trình này có thể cần phải được thoát (với một `\ ') hoặc được trích dẫn để bảo vệ chúng khỏi sự mở rộng của vỏ. Lệnh được thực thi trong thư mục khởi động.

-tệp -fls

Thật; như -ls nhưng ghi vào tập tin như -fprint.

-tệp tệp

Thật; in tên tệp đầy đủ vào tệp tệp . Nếu tập tin không tồn tại khi tìm được chạy, nó sẽ được tạo; nếu nó tồn tại, nó bị cắt ngắn. Các tên tập tin `` / dev / stdout '' và `` / dev / stderr '' được xử lý đặc biệt; chúng đề cập đến đầu ra tiêu chuẩn và đầu ra lỗi chuẩn, tương ứng.

-fprint0 tệp

Thật; như -print0 nhưng ghi vào tập tin như -fprint.

-fprintf định dạng tệp

Thật; như -printf nhưng ghi vào tập tin như -fprint.

lệnh -ok;

Giống như -exec nhưng yêu cầu người dùng đầu tiên (trên đầu vào tiêu chuẩn); nếu đáp ứng không bắt đầu bằng `y 'hoặc` Y', không chạy lệnh và trả về false.

-in

Thật; in tên tệp đầy đủ trên đầu ra tiêu chuẩn, theo sau là một dòng mới.

-print0

Thật; in tên tệp đầy đủ trên đầu ra tiêu chuẩn, theo sau là một ký tự null. Điều này cho phép các tên tệp chứa các dòng mới được giải thích chính xác bằng các chương trình xử lý đầu ra tìm kiếm .

định dạng -printf

Thật; in định dạng trên đầu ra tiêu chuẩn, giải thích `\ 'thoát và`%' chỉ thị. Độ rộng trường và các giá trị có thể được xác định bằng hàm `printf 'C. Không giống như -print, -printf không thêm một dòng mới ở cuối chuỗi. Các lối thoát và chỉ thị là:

\ a

Chuông báo thức.

\ b

Backspace.

\ c

Dừng in từ định dạng này ngay lập tức và xóa đầu ra.

\ f

Thức ăn dạng.

\ n

Dòng mới.

\ r

Vận chuyển trở lại.

\ t

Tab ngang.

\ v

Tab dọc.

\\

Dấu gạch chéo ngược (`\ ').

\ NNN

Ký tự có mã ASCII là NNN (bát phân).

Ký tự `\ 'được theo sau bởi bất kỳ ký tự nào khác được coi là ký tự bình thường, do đó cả hai đều được in.

%%

Một dấu phần trăm chữ.

% a

Thời gian truy cập cuối cùng của tệp theo định dạng được hàm C `ctime 'trả về.

% A k

Thời gian truy cập cuối cùng của tệp theo định dạng được chỉ định bởi k , là `@ 'hoặc chỉ thị cho hàm` strftime' của C `. Các giá trị có thể cho k được liệt kê dưới đây; một số trong số chúng có thể không có sẵn trên tất cả các hệ thống, do sự khác biệt trong `strftime 'giữa các hệ thống.

@

giây kể từ ngày 1 tháng 1 năm 1970, 00:00 GMT.

Trường thời gian:

H

giờ (00,23)

tôi

giờ (01,12)

k

giờ (0,23)

l

giờ (1..12)

M

phút (00..59)

p

AM hoặc AM của địa phương

r

thời gian, 12 giờ (hh: mm: ss [AP] M)

S

thứ hai (00..61)

T

thời gian, 24 giờ (hh: mm: ss)

X

đại diện thời gian của địa phương (H: M: S)

Z

múi giờ (ví dụ: EDT) hoặc không có gì nếu không thể xác định múi giờ

Các trường ngày:

một

tên ngày thường viết tắt của địa phương (Sun..Sat)

A

tên đầy đủ của ngày địa phương của địa phương, độ dài biến đổi (Chủ nhật..Saturday)

b

tên tháng viết tắt của địa phương (Jan..Dec)

B

tên tháng đầy đủ của miền địa phương, độ dài thay đổi (tháng 1 năm sau)

c

ngày và giờ của địa phương (Thứ bảy ngày 04 tháng 11 12:02:33 EST 1989)

d

ngày trong tháng (01,31)

D

ngày (tháng / ngày / năm)

h

giống như b

j

ngày trong năm (001,3666)

m

tháng (01..12)

U

số tuần trong năm với Chủ nhật là ngày đầu tiên trong tuần (00.,53)

w

ngày trong tuần (0..6)

W

số tuần trong năm với Thứ Hai là ngày đầu tiên trong tuần (00..53)

x

đại diện ngày của địa phương (mm / dd / yy)

y

hai số cuối của năm (00,99)

Y

năm (1970 ...)

% b

Kích thước của tệp trong các khối 512 byte (được làm tròn lên).

% c

Thời gian thay đổi trạng thái cuối cùng của tệp ở định dạng được hàm C `ctime 'trả về.

% C k

Thời gian thay đổi trạng thái cuối cùng của tệp theo định dạng được chỉ định bởi k , giống như đối với% A.

% d

Độ sâu của tệp trong cây thư mục; 0 có nghĩa là tập tin là một đối số dòng lệnh.

% f

Tên tệp với bất kỳ thư mục hàng đầu nào bị xóa (chỉ phần tử cuối cùng).

% F

Loại tệp hệ thống tệp đang bật; giá trị này có thể được sử dụng cho -fstype.

% g

Tên nhóm của tệp hoặc ID nhóm số nếu nhóm không có tên.

% G

ID nhóm số của tệp.

% h

Các thư mục hàng đầu của tên tệp (tất cả trừ phần tử cuối cùng).

% H

Đối số dòng lệnh trong đó tệp được tìm thấy.

%tôi

Số inode của tệp (tính bằng số thập phân).

% k

Kích thước của tệp trong khối 1K (được làm tròn lên).

% l

Đối tượng của liên kết tượng trưng (chuỗi rỗng nếu tập tin không phải là một liên kết tượng trưng).

% m

Các bit cho phép của tệp (trong bát phân).

% n

Số lượng liên kết cứng đến tệp.

% p

Tên tệp.

% P

Tên tệp có tên của đối số dòng lệnh mà dưới đó nó được tìm thấy đã bị xóa.

%S

Kích thước của tệp tính bằng byte.

% t

Thời gian sửa đổi cuối cùng của tệp ở định dạng được hàm C `ctime 'trả về.

% T k

Thời gian sửa đổi cuối cùng của tệp theo định dạng được chỉ định bởi k , tương tự như đối với% A.

% u

Tên người dùng của tệp hoặc ID người dùng dạng số nếu người dùng không có tên.

% U

ID người dùng số của tệp.

Ký tự `% 'được theo sau bởi bất kỳ ký tự nào khác bị loại bỏ (nhưng ký tự khác được in).

-prune

Nếu -depth không được cho, đúng; không hạ xuống thư mục hiện tại.
Nếu -depth được cho, sai; không có hiệu lực.

-ls

Thật; liệt kê tệp hiện tại ở định dạng `ls -dils 'trên đầu ra tiêu chuẩn. Số lượng khối là 1K khối, trừ khi biến môi trường POSIXLY_CORRECT được đặt, trong trường hợp này các khối 512 byte được sử dụng.

Nhà khai thác

Được liệt kê theo thứ tự ưu tiên giảm:

( expr )

Lực lượng ưu tiên.

! expr

Đúng nếu expr là sai.

-không expr

Giống như ! expr .

expr1 expr2

Và (ngụ ý); expr2 không được đánh giá nếu expr1 là false.

expr1 -a expr2

Giống như expr1 expr2 .

expr1expr2

Giống như expr1 expr2 .

expr1 -o expr2

Hoặc là; expr2 không được đánh giá nếu expr1 là đúng.

expr1 -hoặc expr2

Giống như expr1 -o expr2 .

expr1 , expr2

Danh sách; cả expr1expr2 luôn được đánh giá. Giá trị của expr1 bị loại bỏ; giá trị của danh sách là giá trị của expr2 .

Ví dụ

tìm / home -user joe

Tìm mọi tệp trong thư mục / nhà thuộc sở hữu của người dùng joe.

tìm / usr -name * stat

Tìm mọi tệp trong thư mục / usr kết thúc bằng ".stat".

tìm / var / spool -mtime +60

Tìm mọi tệp trong thư mục / var / spool đã được sửa đổi hơn 60 ngày trước.

tìm / tmp -name lõi-type f -print | xargs / bin / rm -f

Tìm các tệp có tên lõi trong hoặc bên dưới thư mục / tmp và xóa chúng. Lưu ý rằng thao tác này sẽ hoạt động không chính xác nếu có bất kỳ tên tệp nào chứa dòng mới, dấu ngoặc đơn hoặc dấu ngoặc kép hoặc dấu cách.

tìm / tmp -name core-type f -print0 | xargs -0 / bin / rm -f

Tìm các tệp có tên lõi trong hoặc bên dưới thư mục / tmp và xóa chúng, xử lý tên tệp theo cách mà tên tệp hoặc thư mục chứa dấu ngoặc đơn hoặc dấu ngoặc kép, dấu cách hoặc dòng mới được xử lý chính xác. Kiểm tra -name đến trước kiểm tra kiểu để tránh phải gọi stat (2) trên mọi tệp.

tìm thấy . tập tin f -expe '{}' \;

Chạy `tệp 'trên mọi tệp trong hoặc bên dưới thư mục hiện tại. Lưu ý rằng các dấu ngoặc đơn được đặt trong dấu ngoặc đơn để bảo vệ chúng khỏi việc diễn dịch dưới dạng dấu chấm câu lệnh. Dấu chấm phẩy được bảo vệ tương tự bằng cách sử dụng dấu gạch chéo ngược, mặc dù ';' có thể đã được sử dụng trong trường hợp đó.

tìm / \ (-perm -4000 -fprintf /root/suid.txt '% # m% u% p \ n' \), \ \ (-size + 100M -fprintf /root/big.txt '% -10s% p \ n '\)

Đi qua hệ thống tập tin chỉ một lần, liệt kê các tập tin và thư mục setuid vào /root/suid.txt và các tệp lớn vào /root/big.txt .

tìm $ HOME -mtime 0

Tìm kiếm các tệp trong thư mục chính của bạn đã được sửa đổi trong hai mươi bốn giờ qua. Lệnh này hoạt động theo cách này vì thời gian từ mỗi tệp được sửa đổi lần cuối được chia cho 24 giờ và mọi phần còn lại sẽ bị hủy. Điều đó có nghĩa là để khớp với -mtime

0 , một tập tin sẽ phải có một sửa đổi trong quá khứ đó là ít hơn 24 giờ trước đây.

tìm thấy . -pông 664

Tìm kiếm các tệp có quyền đọc và ghi cho chủ sở hữu và nhóm của họ, nhưng những người dùng khác có thể đọc nhưng không ghi vào. Các tệp đáp ứng các tiêu chí này nhưng có các bit quyền hạn khác được đặt (ví dụ: nếu ai đó có thể thực thi tệp) sẽ không được khớp.

tìm thấy . -perm -664

Tìm kiếm các tệp có quyền đọc và ghi cho chủ sở hữu và nhóm của họ và những người dùng khác có thể đọc, bất kể sự hiện diện của bất kỳ bit quyền bổ sung nào (ví dụ: bit thực thi). Điều này sẽ phù hợp với một tập tin có chế độ 0777, ví dụ.

tìm thấy . -perm / 222

Tìm kiếm các tệp có thể ghi bởi ai đó (chủ sở hữu của họ hoặc nhóm của họ hoặc bất kỳ ai khác).

tìm thấy . -perm / 220 tìm. -perm / u + w, g + w tìm. -pm / u = w, g = w

Cả ba lệnh này đều thực hiện tương tự, nhưng lệnh đầu tiên sử dụng biểu diễn bát phân của chế độ tệp và hai lệnh còn lại sử dụng biểu mẫu. Các lệnh này tất cả tìm kiếm các tệp có thể ghi được bởi chủ sở hữu hoặc nhóm của chúng. Các tập tin không phải được ghi bởi cả chủ sở hữu và nhóm được đối sánh; một trong hai sẽ làm.

tìm thấy . -perm -220 tìm thấy. -perm -g + w, u + w

Cả hai lệnh này đều làm điều tương tự; tìm kiếm các tệp có thể ghi được bởi cả chủ sở hữu và nhóm của họ.

tìm thấy . -perm -444 -perm / 222! -perm / 111 tìm. -perm -a + r -perm / a + w! -perm / a + x

Cả hai lệnh này đều tìm kiếm các tệp có thể đọc được cho tất cả mọi người (-perm -444 hoặc -perm -a + r), có ít nhất trên bộ bit viết (-perm / 222 hoặc -perm / a + w) nhưng không thực thi được cho bất kỳ ai (! -perm / 111 và! -perm / a + x tương ứng)

Quan trọng: Sử dụng lệnh man ( % man ) để xem cách một lệnh được sử dụng trên máy tính cụ thể của bạn.