“Find: caminhos devem preceder a expressão:” Como especificar uma pesquisa recursiva que também encontre arquivos no diretório atual?

235

Estou tendo dificuldades para encontrar correspondências no diretório atual e em seus subdiretórios.

Quando executo find *test.c, apenas as correspondências no diretório atual. (não aparece em subdiretórios)

Se eu tentar find . -name *test.c, esperaria os mesmos resultados, mas, em vez disso, fornecerá apenas correspondências que estão em um subdiretório. Quando há arquivos que devem corresponder no diretório de trabalho, ele me fornece:find: paths must precede expression: mytest.c

O que esse erro significa e como posso obter as correspondências do diretório atual e de seus subdiretórios?

Chris Finley
fonte
4
para o registro, findde msysgit pode lançar esse erro, a menos que cercam o padrão com aspas: find . -name "*test.c". (No caso de você optar por preferir que o Windows seja diferente find.exee use do cmd)
n611x007 14/11/14

Respostas:

393

Tente colocá-lo entre aspas - você está se deparando com a expansão de curinga do shell, então o que você está realmente procurando é:

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

... causando o erro de sintaxe. Então tente isso:

find . -name '*test.c'

Observe as aspas simples em torno da expressão do arquivo - elas impedirão que o shell (bash) expanda seus curingas.

Chris J
fonte
15
A título de exemplo, você pode ver o que está acontecendo se o fizer echo *test.c... o resultado não será eco expandindo o curinga, mas o próprio shell. A lição é simples se você estiver usando wildcards, citar o filespec :-)
Chris J
Obrigado por me ajudar com este VARIANTE. Eu tentei find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’como encontrado na web e recebi "caminhos devem preceder a expressão". O problema era que as aspas eram "inteligentes" demais. Digitei novamente o comando, fazendo com que as aspas fossem substituídas e ele foi executado.
Smandoli 07/01
2
Por algum motivo, aspas simples não funcionaram para mim. Eu tive que usar aspas duplas. ¯ \ _ (ツ) _ / ¯
Planky
aspas simples para pesquisas de caracteres curinga funcionavam com o Busybox e GNU find- se *.$variablevocê estiver usando um curinga, precisará de aspas duplas.
Stuart Cardall
@ Planky: eu coloquei: find, -name 'write.lock' no arquivo de script de shell, mas tem esta mensagem de erro. Mas se eu digitar no console, ele funcionará. Alguém sabe o porquê?
Scott Chu
28

O que está acontecendo é que o shell está expandindo "* test.c" em uma lista de arquivos. Tente escapar do asterisco como:

find . -name \*test.c
Jim Garrison
fonte
#gitbash esta foi a solução para mim com o bash git em janelas, mesmo quando citando o PADRÃOfind . -name '*txt'
um diferente ben
17

Tente colocá-lo entre aspas:

find . -name '*test.c'
rkulla
fonte
13

No manual de localização:

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
Nick Constantine
fonte
0

Me deparei com essa pergunta quando estava tentando encontrar vários nomes de arquivos que não conseguiam combinar em uma expressão regular, conforme descrito na resposta de @Chris J, eis o que funcionou para mim

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

-oou -oré OR lógico. Veja Localizando arquivos no Gnu.org para mais informações.

Eu estava executando isso no CygWin.

HappyTown
fonte
-1

No meu caso, eu estava perdendo o /caminho.

find /var/opt/gitlab/backups/ -name *.tar
Vikash Singh
fonte
1
Um final /não é necessário.
Melpomene