Meskipun menggunakan findperintah 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 extglobyang perlu diatur menggunakan shoptopsi seperti di bawah ini. Opsi diaktifkan dengan -sdukungan dan dinonaktifkan dengan -ubendera. Selain itu Anda dapat menggunakan beberapa opsi lebih banyak yaitu nullglobdi mana gumpalan yang tak tertandingi dihanyutkan seluruhnya, diganti dengan serangkaian kata-kata nol. Dan globstaritu 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 *.csvfile di jalur rekursif
fileList=(**/*.csv)
Pilihannya **adalah berulang melalui sub-folder dan *.csvmerupakan 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 lsdengan 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 findperintah). Sebagai contoh, pertimbangkan kasus yang membutuhkan untuk mendapatkan semua file gambar rekursif yaitu ekstensi *.gif, *.pngdan *.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 bashshell, opsi ini tidak akan tepat.