Mengapa saya dapat menemukan * main.o tetapi tidak dapat * .o?

19

Yang ini benar:

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

Jadi, mengapa saya tidak dapat menemukan *.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
sumber
2
Duplikat askubuntu.com/questions/112722/… ?
TJ Crowder
Yang Anda panggil benar juga salah. Jika ada satu kecocokan di direktori saat ini dan kecocokan lainnya dalam subdirektori, itu tidak akan dapat menemukan keduanya kecuali keduanya kebetulan memiliki nama yang sama. Yaitu dalam contoh pertama Anda mungkin ada file bernama ./sub/domain.o, yang tidak ditemukannya.
kasperd

Jawaban:

46

Mungkin ada lebih dari satu file yang cocok *.o, sementara hanya satu file yang cocok *main.o, jadi, dalam kasus pertama, ekspansi shell berjalan:

$ find . -name main.o

dan ini berhasil. Dalam kasus kedua:

$ find . -name file1.o main.o

Dan inilah mengapa Anda mendapat kesalahan.

Untuk mencegah ini, Anda harus mengutip expressiondalam kedua perintah:

$ find . -name '*.o'
$ find . -name '*main.o'
Lety
sumber
2
Memang, orang dapat dengan mudah memeriksa ini dengan echo *.ovs echo '*.o'.
Ruslan
@Ruslan Tergantung, jika tidak ada file yang cocok dengan glob ( *, ?) bash akan memperlakukannya sebagai karakter literal.
@BroSlow tidak diragukan lagi, saya berbicara tentang situasi khusus OP.
Ruslan
16

Masukkan pola file dalam tanda kutip. Kalau tidak, * diperluas oleh shell (dipecahkan ke daftar file sebelum find melihatnya), membingungkan find.

find . -name "*.o"
Stefan Haustein
sumber
13
Atau melarikan diri *dengan backslash:find -name \*.o
David Foerster