Чому я можу знайти * 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, якого він не знайшов.
kasperd

Відповіді:


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 ( *, ?), буде вважати його буквальним символом.

@BroSlow, безсумнівно, я говорив про конкретну ситуацію, в якій опинився ОП.
Руслан

16

Поставте шаблон файлу в лапки. В іншому випадку * розширюється оболонкою (вирішується до списку файлів, перш ніж знайти її бачить), заплутавши пошук.

find . -name "*.o"

13
Як варіант, втечі *з нахилом:find -name \*.o
Девід Фоерстер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.