Bagaimana `menemukan. -nama * foo * `berhasil?

8

Saya pikir wildcard *dalam perintah find . -name *foo*digantikan oleh bash, namun perintah itu berfungsi kecuali *foo*cocok dengan sesuatu di direktori saat ini, maka itu tidak. Ini membingungkan.

chx
sumber
3
Catatan: Jika Anda mengganti find . -name *foo*dengan find . -name '*foo*'itu akan memungkinkan cocok wildcard berfungsi seperti yang diharapkan.
Bill

Jawaban:

14

Jika bash tidak dapat menemukan kecocokan, itu akan meneruskan string literal ke aplikasi dengan *s unexpanded. Sebagai contoh:

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test *foo*
foo

$ /tmp/test *bar*
*bar*

bashdiperluas *foo*karena cocok, tetapi lulus *bar*langsung karena tidak cocok. The nullglobpilihan akan memberitahu bash untuk mengatasi pola yang tidak cocok dengan string kosong sebagai gantinya:

$ shopt -s nullglob
$ /tmp/test *bar*

$
Michael Mrozek
sumber
1
Sebuah komentar kecil untuk mengatakan bahwa zsh belum perilaku default yang sama, ia mengembalikan kesalahan: zsh: no matches found.
Stéphane Gimenez
zsh harus no_nomatchmemicu perilaku ini.
chx
5

Jika Anda ingin findmendapatkan string yang tidak dikembangkan, maka Anda bisa mengutipnya atau melindungi wildcard dengan backslash.

$ ls
foo

$ cat /tmp/test
echo $1

$ /tmp/test '*foo*'
*foo*

$ /tmp/test \*foo\*
*foo*
Kevin M.
sumber