Dari man find: Harap dicatat bahwa Anda harus mengutip pola sebagai hal yang biasa, jika tidak, shell akan memperluas karakter wildcard di dalamnya.
artdanil
Jawaban:
18
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.
Thx, itu sangat sederhana, tapi saya sudah bertanya-tanya bagaimana cara mengatasinya selama berbulan-bulan. Saya menemukan itu benar-benar aneh, dan menjadi perilaku yang sangat tidak konsisten, tetapi sekarang saya mengerti karena itu tidak ditemukan, tetapi kesalahan bash.
Olivier Toupin
2
Ini bukan "kesalahan" bash per-se tetapi milik Anda karena tidak mengutip wildcard yang ingin Anda sampaikan sebagai argumen. Ini berlaku untuk semua program yang menerima input shell. Shell mengekspansi mereka sebagai gumpalan kecuali mereka dikutip atau melarikan diri.
Caleb
1
Saya kira Olivier memaksudkannya dalam arti, bahwa itu adalah masalah bash, bukan masalah find.
pengguna tidak dikenal
6
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.
Ok, jadi jika *.xmltidak cocok dengan apa pun di direktori saat ini, itu diteruskan secara harfiah, itulah sebabnya ia bekerja dalam kasus lain. Jawaban yang sangat membantu.
Eric Wilson
1
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.xmlfile2.xmlfile3.xml, dan kemudian shell memanggil lsdengan daftar argumen yang dihasilkan file1.xmlfile2.xmlfile3.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":
Shell mengurai baris perintah untuk mengenali karakter khusus dan membaginya menjadi kata-kata dan puntu. Berikut ada hanya daftar kata-kata find, ., -name, *.xmldi mana *dikutip. Sejak *dikutip, itu adalah karakter biasa sejauh menyangkut shell.
Shell berjalan perintah 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:
Shell mem-parsing baris perintah untuk mengenali karakter khusus dan membaginya menjadi kata-kata dan puntu. Berikut ada hanya daftar kata-kata find, ., -name, *.xmldi mana *tidak dikutip.
Karena kata tersebut *.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file. Karena tidak ada nama file yang cocok, polanya tetap tidak diperluas.
Shell menjalankan perintah 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:
Shell mem-parsing baris perintah untuk mengenali karakter khusus dan membaginya menjadi kata-kata dan puntu. Berikut ada hanya daftar kata-kata find, ., -name, *.xmldi mana *tidak dikutip.
Karena kata tersebut *.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xmldigantikan oleh daftar nama file yang cocok.
Shell menjalankan perintah 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:
Shell mem-parsing baris perintah untuk mengenali karakter khusus dan membaginya menjadi kata-kata dan puntu. Berikut ada hanya daftar kata-kata find, ., -name, *.xmldi mana *tidak dikutip.
Karena kata tersebut *.xmlberisi karakter wildcard yang tidak dikutip, shell melakukan pembuatan nama file: *.xmldigantikan oleh daftar nama file yang cocok.
Shell menjalankan perintah 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.)
Saya sudah mencobanya, dan berhasil. Pada GNU bash 4.2.8
bbaja42
3
Ini tidak berfungsi ketika glob cocok dengan apa pun di direktori saat ini. Itu sintaks yang salah! Itu *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.Jawaban:
Jika tidak, shell mengembang Anda
*.xml
untukXYZ.xml
, dan perintah yang benar-benar dijalankan adalahAlasan 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.sumber
bash
, bukan masalahfind
.Anda perlu mengutip argumen Anda seperti ini:
sehingga dilewatkan untuk menemukan alih-alih diperluas oleh shell, lalu disahkan untuk menemukan sebagai versi yang diperluas.
sumber
*.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, misalnyafile1.xml
file2.xml
file3.xml
, dan kemudian shell memanggills
dengan daftar argumen yang dihasilkanfile1.xml
file2.xml
file3.xml
. Itu sebabnya Anda melihat daftar nama file yang samaecho *.xml
, meskipunecho
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 berisifile1.xml
,file2.xml
danfile3.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 mencapaifile2.xml
.Ketika Anda menjalankan
find . -name *.xml
dan direktori saat ini berisi satu file yang cocokfile.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 dipanggilfile.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.)
sumber
Ini berfungsi pada Solaris 10:
find /directory-to-search/* -prune -name "*gz"
sumber
.xml
.Silakan coba:
sumber
*
harus selalu dikutip atau lolos untuk lulus untuk menemukan.