Perché riesco a trovare * main.o ma non riesco a * .o?


19

Questo è corretto:

$ find . -name *main.o
./main.o

Quindi, perché non riesco a trovare *.o?

$ find . -name *.o
find: paths must precede expression: main.o
Usage: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]


Anche quello che chiami corretto è sbagliato. Se esiste una corrispondenza nella directory corrente e un'altra in una sottodirectory, non sarà in grado di trovarle entrambe a meno che entrambe non abbiano lo stesso nome. Vale a dire nel tuo primo esempio potrebbe esserci stato un file chiamato ./sub/domain.o, che non ha trovato.
Kasperd,

Risposte:


46

Probabilmente ci sono più file che corrispondono *.o, mentre solo un file corrisponde *main.o, quindi, nel primo caso, viene eseguita l'espansione della shell:

$ find . -name main.o

e questo funziona. Nel secondo caso:

$ find . -name file1.o main.o

Ed è per questo che hai ricevuto un errore.

Per evitare ciò, dovresti citare expressionin entrambi i comandi:

$ find . -name '*.o'
$ find . -name '*main.o'

2
In effetti, si può facilmente controllare questo con echo *.ovs echo '*.o'.
Ruslan,

@Ruslan Dipende, se non ci sono file corrispondenti al glob ( *, ?) bash lo considererà come il carattere letterale.

@BroSlow senza dubbio, stavo parlando della situazione particolare in cui si trovava l'OP.
Ruslan,

16

Inserisci il modello di file tra virgolette. Altrimenti, * viene espanso dalla shell (risolto in un elenco di file prima che find lo veda), confondendo find.

find . -name "*.o"

13
In alternativa, scappa *con una barra rovesciata:find -name \*.o
David Foerster,
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.