Почему я могу найти * 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]


Тот, кого вы называете правильным, тоже не тот. Если есть одно совпадение в текущем каталоге и другое совпадение в подкаталоге, он не сможет найти оба, если оба не имеют одно и то же имя. Т.е. в вашем первом примере мог быть файл с именем ./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
Дэвид Фёрстер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.