Почему я могу найти * main.o, но не могу * .o?

19

Это правильно:

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

Итак, почему я не могу найти *.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]
Том Брито
источник
2
Дубликат askubuntu.com/questions/112722/… ?
TJ Crowder
Тот, кого вы называете правильным, тоже не тот. Если есть одно совпадение в текущем каталоге и другое совпадение в подкаталоге, он не сможет найти оба, если оба не имеют одно и то же имя. Т.е. в вашем первом примере мог быть файл с именем ./sub/domain.o, который он не нашел.
Касперд

Ответы:

46

Вероятно, существует более одного совпадающего файла *.o, в то время как совпадает только один файл *main.o, поэтому в первом случае запускается расширение оболочки:

$ find . -name main.o

и это работает. Во втором случае:

$ find . -name file1.o main.o

И вот почему вы получили ошибку.

Чтобы предотвратить это, вы должны заключить expressionв обе команды:

$ find . -name '*.o'
$ find . -name '*main.o'
Лети
источник
2
Действительно, можно легко проверить это с echo *.oпротив echo '*.o'.
Руслан
@Ruslan Зависит, если нет файлов, соответствующих glob ( *, ?), bash будет рассматривать его как буквенный символ.
@BroSlow, несомненно, я говорил о конкретной ситуации, в которой находился ОП.
Руслан
16

Поместите шаблон файла в кавычки. В противном случае * расширяется оболочкой (разрешается в список файлов, прежде чем find ее видит), что приводит к путанице в find.

find . -name "*.o"
Стефан Хаустейн
источник
13
Альтернативно побег *с обратной косой чертой:find -name \*.o
Дэвид Фёрстер