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 *.xml
untuk 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.
*.xml
tidak 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. find
adalah salah satu dari beberapa perintah yang melakukan pencocokan wildcard yang mirip dengan shell, pada waktunya sendiri.
Saat Anda menjalankan ls *.xml
, pertama shell memperluas *.xml
ke daftar file yang cocok, misalnya file1.xml
file2.xml
file3.xml
, dan kemudian shell memanggil ls
dengan daftar argumen yang dihasilkan file1.xml
file2.xml
file3.xml
. Itu sebabnya Anda melihat daftar nama file yang sama echo *.xml
, meskipun echo
tidak tahu apa-apa tentang file dan tidak peduli apakah argumennya adalah nama file.
Ketika Anda menjalankan find . -name "*.xml"
:
find
, .
, -name
, *.xml
di mana *
dikutip. Sejak *
dikutip, itu adalah karakter biasa sejauh menyangkut shell.find
dengan daftar tertentu argumen: .
, -name
, *.xml
.find
mencari file yang namanya cocok dengan pola *.xml
di direktori mana pun di bawah direktori saat ini.Ketika Anda menjalankan find . -name *.xml
dan tidak ada file yang cocok *.xml
:
find
, .
, -name
, *.xml
di mana *
tidak dikutip.*.xml
berisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file. Karena tidak ada nama file yang cocok, polanya tetap tidak diperluas.find
dengan daftar yang dihasilkan dari argumen, yang .
, -name
, *.xml
.find
mencari file yang namanya cocok dengan pola *.xml
di direktori mana pun di bawah direktori saat ini.Ketika Anda menjalankan find . -name *.xml
dan direktori saat ini berisi file1.xml
, file2.xml
dan file3.xml
:
find
, .
, -name
, *.xml
di mana *
tidak dikutip.*.xml
berisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xml
digantikan oleh daftar nama file yang cocok.find
dengan daftar yang dihasilkan dari argumen, yang .
, -name
, file1.xml
, file2.xml
, file3.xml
.find
mengeluh tentang kesalahan sintaks ketika mencapai file2.xml
.Ketika Anda menjalankan find . -name *.xml
dan direktori saat ini berisi satu file yang cocok file.xml
:
find
, .
, -name
, *.xml
di mana *
tidak dikutip.*.xml
berisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xml
digantikan oleh daftar nama file yang cocok.find
dengan daftar yang dihasilkan dari argumen, yang .
, -name
, file.xml
.find
melihat perintah yang benar-benar valid, tetapi mungkin itu bukan yang Anda maksudkan: find
diperintahkan untuk mencari file yang dipanggil file.xml
dalam 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.