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]


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'

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"

13
Atau melarikan diri *dengan backslash:find -name \*.o
David Foerster
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.