Mengapa temuan saya tidak rekursif?

65

Saya menjalankan perintah berikut, tetapi tidak dilakukan secara rekursif:

find . -name *.java

Saya tahu ada file java lebih jauh di direktori saat ini tetapi hanya menjalankan finddirektori saat ini saja. Saya menggunakan OS X, 10.9.

pengguna11498
sumber
@Gilles: T&J ini jauh lebih jelas dan kurang terlokalisasi daripada korban penipuan - jika salah satu dari mereka harus ditutup, itu yang lain.
goldilocks

Jawaban:

88

Masalahnya adalah, Anda tidak mengutip -nameparameter Anda . Lakukan ini sebagai gantinya:

find . -name '*.java'

Penjelasan

Tanpa tanda kutip, shell mengartikan *.javasebagai pola glob dan memperluasnya ke nama file apa pun yang cocok dengan glob sebelum meneruskannya find. Dengan cara ini, jika Anda memiliki, katakanlah, foo.javadi direktori saat ini, findbaris perintah sebenarnya adalah:

find . -name foo.java

yang jelas akan mencantumkan file dalam direktori saat ini saja (kecuali Anda kebetulan memiliki beberapa file dengan nama yang sama lebih jauh ke bawah pohon).

Mengutip mencegah ekspansi gumpal dan meneruskan baris perintah findapa adanya.

Secara kebetulan, jika glob gagal mencocokkan (tidak ada *.javafile di direktori saat ini), Anda akan mendapatkan salah satu dari dua perilaku tergantung pada bagaimana shell Anda diatur untuk menangani gumpalan yang tidak cocok (ini diatur oleh nullglobopsi di Bash , sebagai contoh):

  1. Jika bola yang tidak cocok tidak diperluas oleh shell, findakan (secara tidak sengaja, ingatkan Anda) menunjukkan perilaku yang benar.
  2. Jika gumpalan yang tidak cocok diperluas menjadi string kosong oleh shell, findakan mengeluh bahwa ia tidak memiliki argumen -name.
Joseph R.
sumber
20

Saya memiliki situasi yang serupa di mana saya mengelilingi nilai -nama dalam tanda kutip, tetapi masih belum mendapatkan semua temuan yang saya harapkan. Saya menduga bahwa itu karena symlink dan cukup yakin itulah masalahnya. Jika Anda ingin memaksa find untuk mencari melalui symlink, Anda dapat memodifikasi perintah sebagai berikut:

find -L . -name '*.java'
gaoagong
sumber
Symlink juga merupakan masalah saya. -followadalah sinonim yang lebih mudah dibaca untuk -L, selama Anda meletakkannya sebelum params lainnya.
Noumenon
0

Escape the *

find . -name \*.java
Stuart Cardall
sumber