Bayangkan sebuah pohon sumber. Ada file xml di mana-mana.
Tetapi karena ada XYZ.xml pada akar pohon ini, ia tidak akan menemukan file xml saya.
find -iname *.xml
kembali
./XYZ.xml
dari pada
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Bayangkan sebuah pohon sumber. Ada file xml di mana-mana.
Tetapi karena ada XYZ.xml pada akar pohon ini, ia tidak akan menemukan file xml saya.
find -iname *.xml
kembali
./XYZ.xml
dari pada
./XYZ.xml
./a/b/c/bob.xml
./b/d/top.xml
Jawaban:
find -iname '*.xml'
Jika tidak, shell mengembang Anda *.xmluntuk XYZ.xml, dan perintah yang benar-benar dijalankan adalah
find -iname XYZ.xml
Alasan ini berfungsi jika tidak ada file XML di direktori saat ini adalah bahwa shell umumnya membiarkan wildcard tidak diperluas jika tidak cocok dengan apa pun. Secara umum, setiap kali Anda ingin wildcard untuk diperluas oleh program lain selain shell (misalnya dengan find, tar, scp, dll) Anda perlu untuk mengutip mereka sehingga shell tidak akan mencoba untuk memperluas mereka sendiri.
bash, bukan masalah find.
Anda perlu mengutip argumen Anda seperti ini:
find ./ -name '*.xml'
sehingga dilewatkan untuk menemukan alih-alih diperluas oleh shell, lalu disahkan untuk menemukan sebagai versi yang diperluas.
*.xmltidak cocok dengan apa pun di direktori saat ini, itu diteruskan secara harfiah, itulah sebabnya ia bekerja dalam kasus lain. Jawaban yang sangat membantu.
Wildcard diperluas oleh shell, bukan oleh perintah. findadalah salah satu dari beberapa perintah yang melakukan pencocokan wildcard yang mirip dengan shell, pada waktunya sendiri.
Saat Anda menjalankan ls *.xml, pertama shell memperluas *.xmlke daftar file yang cocok, misalnya file1.xml file2.xml file3.xml, dan kemudian shell memanggil lsdengan daftar argumen yang dihasilkan file1.xml file2.xml file3.xml. Itu sebabnya Anda melihat daftar nama file yang sama echo *.xml, meskipun echotidak tahu apa-apa tentang file dan tidak peduli apakah argumennya adalah nama file.
Ketika Anda menjalankan find . -name "*.xml":
find, ., -name, *.xmldi mana *dikutip. Sejak *dikutip, itu adalah karakter biasa sejauh menyangkut shell.finddengan daftar tertentu argumen: ., -name, *.xml.findmencari file yang namanya cocok dengan pola *.xmldi direktori mana pun di bawah direktori saat ini.Ketika Anda menjalankan find . -name *.xmldan tidak ada file yang cocok *.xml:
find, ., -name, *.xmldi mana *tidak dikutip.*.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file. Karena tidak ada nama file yang cocok, polanya tetap tidak diperluas.finddengan daftar yang dihasilkan dari argumen, yang ., -name, *.xml.findmencari file yang namanya cocok dengan pola *.xmldi direktori mana pun di bawah direktori saat ini.Ketika Anda menjalankan find . -name *.xmldan direktori saat ini berisi file1.xml, file2.xmldan file3.xml:
find, ., -name, *.xmldi mana *tidak dikutip.*.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xmldigantikan oleh daftar nama file yang cocok.finddengan daftar yang dihasilkan dari argumen, yang ., -name, file1.xml, file2.xml, file3.xml.findmengeluh tentang kesalahan sintaks ketika mencapai file2.xml.Ketika Anda menjalankan find . -name *.xmldan direktori saat ini berisi satu file yang cocok file.xml:
find, ., -name, *.xmldi mana *tidak dikutip.*.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xmldigantikan oleh daftar nama file yang cocok.finddengan daftar yang dihasilkan dari argumen, yang ., -name, file.xml.findmelihat perintah yang benar-benar valid, tetapi mungkin itu bukan yang Anda maksudkan: finddiperintahkan untuk mencari file yang dipanggil file.xmldalam direktori apa pun, bukan untuk mencari file yang cocok *.xml.(Evaluasi dan perluasan Shell memiliki banyak fitur lain. Saya hanya menyebutkan yang relevan di sini.)
(Apa yang saya jelaskan adalah perilaku default dari shell yang paling umum: sh, bash, dash, ksh, ... Beberapa shell dapat dikonfigurasi untuk menampilkan kesalahan alih-alih menjalankan perintah dengan wildcard yang tidak diperluas, atau untuk memperluas wildcard yang tidak cocok menjadi kosong daftar. Tidak ada yang akan membantu di sini.)
Ini berfungsi pada Solaris 10:
find /directory-to-search/* -prune -name "*gz"
.xml.
Silakan coba:
find ./ -name *.xml
*harus selalu dikutip atau lolos untuk lulus untuk menemukan.
man find: Harap dicatat bahwa Anda harus mengutip pola sebagai hal yang biasa, jika tidak, shell akan memperluas karakter wildcard di dalamnya.