Pourquoi je peux trouver * main.o mais pas * .o?

19

Celui-ci est correct:

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

Alors, pourquoi je ne trouve pas *.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]
Tom Brito
la source
2
Duplicata de askubuntu.com/questions/112722/… ?
TJ Crowder
Celui que vous appelez correct est également faux. S'il y a une correspondance dans le répertoire en cours et une autre correspondance dans un sous-répertoire, il ne pourra pas trouver les deux à moins que les deux aient le même nom. C'est-à-dire que dans votre premier exemple, il aurait pu y avoir un fichier appelé ./sub/domain.o, qu'il n'a pas trouvé.
kasperd

Réponses:

46

Il y a probablement plus d'un fichier qui correspond *.o, alors qu'un seul fichier correspond *main.o, donc, dans le premier cas, l'expansion du shell s'exécute:

$ find . -name main.o

et cela fonctionne. Dans le second cas:

$ find . -name file1.o main.o

Et c'est pourquoi vous avez eu une erreur.

Afin d'éviter cela, vous devez citer expressiondans les deux commandes:

$ find . -name '*.o'
$ find . -name '*main.o'
Lety
la source
2
En effet, on peut facilement vérifier avec echo *.ovs echo '*.o'.
Ruslan
@Ruslan Dépend, s'il n'y a pas de fichiers correspondant au bash glob ( *, ?) le traitera comme le caractère littéral.
@BroSlow sans aucun doute, je parlais de la situation particulière du PO.
Ruslan
16

Mettez le modèle de fichier entre guillemets. Sinon, * est développé par le shell (résolu en une liste de fichiers avant que find ne le voit), ce qui déroute find.

find . -name "*.o"
Stefan Haustein
la source
13
Vous pouvez également vous échapper *avec une barre oblique inverse:find -name \*.o
David Foerster