“Trova: i percorsi devono precedere l'espressione:” Come posso specificare una ricerca ricorsiva che trova anche i file nella directory corrente?


235

Sto facendo fatica a trovare le corrispondenze nella directory corrente e nelle sue sottodirectory.

Quando corro find *test.cmi dà solo le corrispondenze nella directory corrente. (non cerca nelle sottodirectory)

Se provo find . -name *test.cmi aspetterei gli stessi risultati, ma invece mi dà solo corrispondenze che si trovano in una sottodirectory. Quando ci sono file che dovrebbero corrispondere nella directory di lavoro, mi dà:find: paths must precede expression: mytest.c

Cosa significa questo errore e come posso ottenere le corrispondenze sia dalla directory corrente che dalle sue sottodirectory?


4
per la cronaca, finddi msysgit può gettare questo errore a meno che vi circondano lo schema con le citazioni: find . -name "*test.c". (Nel caso in cui si scelga di preferirlo rispetto a Windows 'diverso find.exee utilizzare da cmd)
n611x007

Risposte:


393

Prova a metterlo tra virgolette: stai eseguendo l'espansione jolly della shell, quindi ciò che stai passando per trovare sarà simile a:

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

... causando l'errore di sintassi. Quindi prova questo invece:

find . -name '*test.c'

Nota le virgolette singole intorno all'espressione del tuo file: queste impediranno alla shell (bash) di espandere i caratteri jolly.


15
A titolo di esempio, puoi vedere cosa succede se lo fai echo *test.c... il risultato non sarà l'eco che espande il carattere jolly, ma la shell stessa. La semplice lezione è se stai usando i caratteri jolly, cita il filespec :-)
Chris J

Grazie per avermi aiutato con questo VARIANTE. Ho provato find . -type f -printf ‘%TY-%Tm-%Td %TT %p\n’come trovato sul web e ho incontrato "i percorsi devono precedere l'espressione". Il problema era che le virgolette erano troppo "intelligenti". Ho digitato nuovamente il comando, facendo sì che le virgolette vengano sostituite ed è stato eseguito.
Smandoli,

2
Per qualche ragione le virgolette singole non hanno funzionato per me. Ho dovuto usare virgolette doppie. ¯ \ _ (ツ) _ / ¯
Planky,

virgolette singole per ricerche con caratteri jolly funzionanti con Busybox e GNU find- se si utilizza un carattere jolly *.$variablesono necessarie virgolette doppie.
Stuart Cardall,

@Planky: ho inserito: find, -name 'write.lock' nel file di script della shell ma contiene questo messaggio di errore. Ma se scrivo console, funziona. Qualcuno sa perché?
Scott Chu,

28

Quello che sta succedendo è che la shell sta espandendo "* test.c" in un elenco di file. Prova a fuggire dall'asterisco come:

find . -name \*test.c

#gitbash questa è stata la soluzione per me con git bash su Windows, anche quando ho citato il PATTERNfind . -name '*txt'
un diverso ben

17

Prova a metterlo tra virgolette:

find . -name '*test.c'

13

Dal manuale di ricerca:

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

Mi sono imbattuto in questa domanda quando stavo cercando di trovare più nomi di file che non potevo combinare in un'espressione regolare come descritto nella risposta di @Chris J, ecco cosa ha funzionato per me

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

-oo -orè OR logico. Vedi Trovare file su Gnu.org per maggiori informazioni.

Lo stavo eseguendo su CygWin.


-1

Nel mio caso mi mancava il trailing /nel percorso.

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

1
/Non è richiesto un trascinamento .
melpomene,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.