«Find: paths должен предшествовать выражению:» Как мне указать рекурсивный поиск, который также находит файлы в текущем каталоге?

235

Я с трудом получая находку для поиска совпадений в текущем каталоге, а также его подкаталогов.

Когда я запускаю find *test.cэто только дает мне совпадения в текущем каталоге. (не смотрит в подкаталоги)

Если я попытаюсь, find . -name *test.cя ожидаю те же результаты, но вместо этого он дает мне только совпадения, которые находятся в подкаталоге. Когда есть файлы, которые должны соответствовать в рабочем каталоге, это дает мне:find: paths must precede expression: mytest.c

Что означает эта ошибка, и как я могу получить совпадения как из текущего каталога, так и из его подкаталогов?

Крис Финли
источник
4
для записи, findиз msysgit может бросить эту ошибку , если вы не окружать шаблон в кавычки: find . -name "*test.c". (В случае, если вы предпочитаете, чтобы он отличался find.exeот Windows и отличался от cmd)
n611x007,

Ответы:

393

Попробуйте поместить его в кавычки - вы работаете с расширением подстановочного знака оболочки, поэтому то, что вы фактически передаете, чтобы найти, будет выглядеть так:

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

... вызывая синтаксическую ошибку. Так что попробуйте это вместо:

find . -name '*test.c'

Обратите внимание на одинарные кавычки вокруг выражения вашего файла - они остановят оболочку (bash), расширяющую символы подстановки.

Крис Дж
источник
15
В качестве примера, вы можете увидеть, что происходит, если вы это сделаете echo *test.c... результатом будет не эхо, расширяющее шаблон, а сама оболочка. Простой урок: если вы используете подстановочные знаки, процитируйте спецификацию файла :-)
Chris J
Спасибо за помощь мне с этим VARIANT. Я попытался, find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’как нашел в Интернете, и встретил «пути должны предшествовать выражению». Проблема заключалась в том, что кавычки были слишком «умными». Я снова набрал команду, заставив заменить кавычки, и она запустилась.
Smandoli
2
По какой-то причине одинарные кавычки не работали для меня. Я должен был использовать двойные кавычки. ¯ \ _ (ツ) _ / ¯
Планки
одинарные кавычки для поиска по шаблону работали с Busybox и GNU find- если вы используете подстановочный знак, *.$variableвам нужны двойные кавычки.
Стюарт Кардалл
@Planky: Я поместил: find, -name 'write.lock' в файл сценария оболочки, но у него есть это сообщение об ошибке. Но если я наберу в консоли, это работает. Кто-нибудь знает почему?
Скотт Чу
28

Происходит то, что оболочка расширяет "* test.c" в список файлов. Попробуйте экранировать звездочку как:

find . -name \*test.c
Джим гаррисон
источник
#gitbash это было решением для меня с помощью git bash на windows, даже при цитировании PATTERNfind . -name '*txt'
другой бен
17

Попробуйте поместить это в кавычки:

find . -name '*test.c'
rkulla
источник
13

Из найти руководство:

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

Я столкнулся с этим вопросом, когда пытался найти несколько имен файлов, которые я не мог объединить в регулярное выражение, как описано в ответе @Chris J, вот что сработало для меня

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

-oили -orлогическое ИЛИ. См. Поиск файлов на Gnu.org для получения дополнительной информации.

Я запускал это на CygWin.

HappyTown
источник
-1

В моем случае мне не хватало трейлинга /в пути.

find /var/opt/gitlab/backups/ -name *.tar
Викаш Сингх
источник
1
Трейлинг /не требуется.
Мельпомена