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 find
direktori saat ini saja. Saya menggunakan OS X, 10.9.
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 find
direktori saat ini saja. Saya menggunakan OS X, 10.9.
Jawaban:
Masalahnya adalah, Anda tidak mengutip -name
parameter Anda . Lakukan ini sebagai gantinya:
find . -name '*.java'
Penjelasan
Tanpa tanda kutip, shell mengartikan *.java
sebagai pola glob dan memperluasnya ke nama file apa pun yang cocok dengan glob sebelum meneruskannya find
. Dengan cara ini, jika Anda memiliki, katakanlah, foo.java
di direktori saat ini, find
baris 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 find
apa adanya.
Secara kebetulan, jika glob gagal mencocokkan (tidak ada *.java
file 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 nullglob
opsi di Bash , sebagai contoh):
find
akan (secara tidak sengaja, ingatkan Anda) menunjukkan perilaku yang benar.find
akan mengeluh bahwa ia tidak memiliki argumen -name
.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'
-follow
adalah sinonim yang lebih mudah dibaca untuk -L
, selama Anda meletakkannya sebelum params lainnya.
Escape the *
find . -name \*.java