Tại sao tôi có thể tìm thấy * main.o nhưng không thể * .o?


19

Điều này là chính xác:

$ find . -name *main.o
./main.o

Vậy tại sao tôi không thể tìm thấy *.o?

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]


Người bạn gọi đúng cũng sai. Nếu có một kết quả khớp trong thư mục hiện tại và một kết quả khớp khác trong thư mục con, nó sẽ không thể tìm thấy cả hai trừ khi cả hai đều có cùng tên. Tức là trong ví dụ đầu tiên của bạn có thể có một tệp được gọi ./sub/domain.o, mà nó không tìm thấy.
kasperd

Câu trả lời:


46

Có thể có nhiều hơn một tệp trùng khớp *.o, trong khi chỉ có một tệp khớp *main.o, vì vậy, trong trường hợp đầu tiên, mở rộng shell chạy:

$ find . -name main.o

và điều này hoạt động. Trong trường hợp thứ hai:

$ find . -name file1.o main.o

Và đây là lý do tại sao bạn gặp lỗi.

Để ngăn chặn điều này, bạn nên trích dẫn expressiontrong cả hai lệnh:

$ find . -name '*.o'
$ find . -name '*main.o'

2
Thật vậy, người ta có thể dễ dàng kiểm tra điều này với echo *.ovs echo '*.o'.
Ruslan

@Ruslan Tùy thuộc, nếu không có tệp nào khớp với bash global ( *, ?) sẽ coi nó là ký tự chữ.

@BroSlow chắc chắn, tôi đã nói về tình huống cụ thể mà OP gặp phải.
Ruslan

16

Đặt mẫu tập tin trong dấu ngoặc kép. Mặt khác, * được mở rộng bởi trình bao (được phân giải thành danh sách các tệp trước khi tìm thấy), tìm thấy khó hiểu.

find . -name "*.o"

13
Hoặc thoát *bằng dấu gạch chéo ngược:find -name \*.o
David Foerster
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.