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

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

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

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

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

Ответ 1

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

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

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

find . -name '*test.c'

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

Ответ 2

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

find . -name \*test.c

Ответ 3

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

find . -name '*test.c'

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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