Meskipun menggunakan find
perintah dapat berguna di sini, shell itu sendiri menyediakan opsi untuk mencapai persyaratan ini tanpa alat pihak ketiga. Itubash
shell menyediakan pilihan dukungan gumpal diperpanjang menggunakan yang Anda dapat mendapatkan nama file di bawah jalur rekursif bahwa pertandingan dengan ekstensi yang Anda inginkan.
Opsi yang diperluas adalah extglob
yang perlu diatur menggunakan shopt
opsi seperti di bawah ini. Opsi diaktifkan dengan -s
dukungan dan dinonaktifkan dengan -u
bendera. Selain itu Anda dapat menggunakan beberapa opsi lebih banyak yaitu nullglob
di mana gumpalan yang tak tertandingi dihanyutkan seluruhnya, diganti dengan serangkaian kata-kata nol. Dan globstar
itu memungkinkan untuk berulang melalui semua direktori
shopt -s extglob nullglob globstar
Sekarang yang perlu Anda lakukan adalah membentuk ekspresi glob untuk menyertakan file-file dari ekstensi tertentu yang dapat Anda lakukan seperti di bawah ini. Kami menggunakan array untuk mengisi hasil glob karena ketika dikutip dengan benar dan diperluas, nama file dengan karakter khusus akan tetap utuh dan tidak rusak karena pemisahan kata oleh shell.
Misalnya untuk mendaftar semua *.csv
file di jalur rekursif
fileList=(**/*.csv)
Pilihannya **
adalah berulang melalui sub-folder dan *.csv
merupakan ekspansi global untuk memasukkan file ekstensi yang disebutkan. Sekarang untuk mencetak file yang sebenarnya, lakukan saja
printf '%s\n' "${fileList[@]}"
Menggunakan array dan melakukan ekspansi kutipan yang tepat adalah cara yang tepat ketika digunakan dalam skrip shell, tetapi untuk penggunaan interaktif, Anda bisa menggunakan ls
dengan ekspresi glob sebagai
ls -1 -- **/*.csv
Ini bisa sangat diperluas untuk mencocokkan beberapa file yaitu file yang diakhiri dengan beberapa ekstensi (yaitu mirip dengan menambahkan beberapa flag dalam find
perintah). Sebagai contoh, pertimbangkan kasus yang membutuhkan untuk mendapatkan semua file gambar rekursif yaitu ekstensi *.gif
, *.png
dan *.jpg
, yang Anda butuhkan adalah
ls -1 -- **/+(*.jpg|*.gif|*.png)
Ini bisa sangat diperluas untuk memiliki hasil negasi juga. Dengan sintaksis yang sama, seseorang dapat menggunakan hasil dari glob untuk mengecualikan file dari tipe tertentu. Anggap Anda ingin mengecualikan nama file dengan ekstensi di atas, Anda bisa melakukannya
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
Konstruksinya !()
adalah operasi meniadakan untuk tidak menyertakan ekstensi file yang tercantum di dalam dan |
merupakan operator bergantian seperti yang digunakan di pustaka Ekspresi Reguler Diperpanjang untuk melakukan pencocokan ATAU dari gumpalan.
Perhatikan bahwa dukungan glob yang diperluas ini tidak tersedia di shell bourne POSIX dan murni khusus untuk versi terbaru dari bash
. Jadi jika Anda mempertimbangkan portabilitas skrip yang berjalan di POSIX dan bash
shell, opsi ini tidak akan tepat.