@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):
Jika bola yang tidak cocok tidak diperluas oleh shell, findakan (secara tidak sengaja, ingatkan Anda) menunjukkan perilaku yang benar.
Jika gumpalan yang tidak cocok diperluas menjadi string kosong oleh shell, findakan 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:
Jawaban:
Masalahnya adalah, Anda tidak mengutip
-name
parameter Anda . Lakukan ini sebagai gantinya:Penjelasan
Tanpa tanda kutip, shell mengartikan
*.java
sebagai pola glob dan memperluasnya ke nama file apa pun yang cocok dengan glob sebelum meneruskannyafind
. Dengan cara ini, jika Anda memiliki, katakanlah,foo.java
di direktori saat ini,find
baris perintah sebenarnya adalah: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 olehnullglob
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
.sumber
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:
sumber
-follow
adalah sinonim yang lebih mudah dibaca untuk-L
, selama Anda meletakkannya sebelum params lainnya.Escape the
*
sumber