Tìm kiếm: đường dẫn phải đi trước biểu thức: Tên Làm thế nào để tôi chỉ định một tìm kiếm đệ quy cũng tìm thấy các tệp trong thư mục hiện tại?


234

Tôi đang gặp khó khăn trong việc tìm kiếm các kết quả trùng khớp trong thư mục hiện tại cũng như các thư mục con của nó.

Khi tôi chạy find *test.cnó chỉ cung cấp cho tôi các trận đấu trong thư mục hiện tại. (không tìm trong thư mục con)

Nếu tôi thử, find . -name *test.ctôi sẽ mong đợi kết quả tương tự, nhưng thay vào đó, nó chỉ cho tôi các kết quả trùng khớp trong thư mục con. Khi có các tệp phù hợp trong thư mục làm việc, nó sẽ cho tôi:find: paths must precede expression: mytest.c

Lỗi này có nghĩa là gì và làm cách nào tôi có thể nhận được các kết quả khớp từ cả thư mục hiện tại và thư mục con của nó?


4
cho các hồ sơ, findcủa msysgit thể ném lỗi này trừ khi bạn bao quanh mô hình với dấu ngoặc kép: find . -name "*test.c". (Trong trường hợp bạn chọn thích nó hơn Windows 'khác nhau find.exevà sử dụng từ cmd)
n611x007

Câu trả lời:


392

Hãy thử đặt nó trong dấu ngoặc kép - bạn đang chạy vào bản mở rộng ký tự đại diện của vỏ, vì vậy những gì bạn đang đi qua để tìm sẽ giống như:

find . -name bobtest.c cattest.c snowtest.c

... gây ra lỗi cú pháp. Vì vậy, hãy thử điều này thay thế:

find . -name '*test.c'

Lưu ý các trích dẫn duy nhất xung quanh biểu thức tệp của bạn - chúng sẽ ngăn vỏ (bash) mở rộng ký tự đại diện của bạn.


15
Ví dụ, bạn có thể thấy những gì đang xảy ra nếu bạn làm echo *test.c... kết quả sẽ không phải là tiếng vang mở rộng ký tự đại diện, mà là chính vỏ. Bài học đơn giản là nếu bạn đang sử dụng ký tự đại diện, hãy trích dẫn các tập tin :-)
Chris J

Cảm ơn đã giúp tôi với VariANT này. Tôi đã thử find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’như tìm thấy trên web và đã gặp "đường dẫn phải đi trước biểu thức". Vấn đề là dấu ngoặc kép quá "thông minh". Tôi đã gõ lại lệnh, làm cho các trích dẫn được thay thế, và nó chạy.
Smandoli

2
Vì một số lý do, trích dẫn đơn không làm việc cho tôi. Tôi đã phải sử dụng dấu ngoặc kép. ¯ \ _ (ツ) _ / ¯
Planky

dấu ngoặc đơn cho các tìm kiếm ký tự đại diện hoạt động với Busybox & GNU find- nếu sử dụng ký tự đại diện, *.$variablebạn cần dấu ngoặc kép.
Stuart Cardall

@Planky: Tôi đặt: find, -name 'write.lock' trong tệp script shell nhưng nó có thông báo lỗi này. Nhưng nếu tôi gõ trong giao diện điều khiển, nó hoạt động. Có ai biết tại sao không?
Scott Chu

28

Điều đang xảy ra là shell đang mở rộng "* test.c" thành một danh sách các tệp. Hãy thử thoát dấu hoa thị như:

find . -name \*test.c

#gitbash đây là giải pháp cho tôi với git bash trên windows, ngay cả khi trích dẫn MẪUfind . -name '*txt'
một ben khác

17

Hãy thử đặt nó trong dấu ngoặc kép:

find . -name '*test.c'

13

Từ tìm hướng dẫn sử dụng:

NON-BUGS         

   Operator precedence surprises
   The command find . -name afile -o -name bfile -print will never print
   afile because this is actually equivalent to find . -name afile -o \(
   -name bfile -a -print \).  Remember that the precedence of -a is
   higher than that of -o and when there is no operator specified
   between tests, -a is assumed.

   “paths must precede expression” error message
   $ find . -name *.c -print
   find: paths must precede expression
   Usage: find [-H] [-L] [-P] [-Olevel] [-D ... [path...] [expression]

   This happens because *.c has been expanded by the shell resulting in
   find actually receiving a command line like this:
   find . -name frcode.c locate.c word_io.c -print
   That command is of course not going to work.  Instead of doing things
   this way, you should enclose the pattern in quotes or escape the
   wildcard:
   $ find . -name '*.c' -print
   $ find . -name \*.c -print

0

Tôi đã gặp câu hỏi này khi tôi đang cố gắng tìm nhiều tên tệp mà tôi không thể kết hợp thành một biểu thức chính quy như được mô tả trong câu trả lời của @Chris J, đây là những gì làm việc cho tôi

find . -name one.pdf -o -name two.txt -o -name anotherone.jpg

-ohoặc -orlà logic HOẶC. Xem Tìm tệp trên Gnu.org để biết thêm thông tin.

Tôi đã chạy nó trên CygWin.


-1

Trong trường hợp của tôi, tôi đã bị mất dấu /trong đường dẫn.

find /var/opt/gitlab/backups/ -name *.tar

1
Một dấu vết /là không cần thiết.
melpomene
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.