แม้ว่าการใช้findคำสั่งจะมีประโยชน์ที่นี่เชลล์เองมีตัวเลือกเพื่อให้บรรลุความต้องการนี้โดยไม่ต้องใช้เครื่องมือของบุคคลที่สาม bashเปลือกยังมีตัวเลือกการสนับสนุน glob ขยายการใช้ที่คุณจะได้รับชื่อไฟล์ที่อยู่ภายใต้เส้นทาง recursive ว่าการแข่งขันที่มีส่วนขยายที่คุณต้องการ
ตัวเลือกเพิ่มเติมคือextglobสิ่งที่จะต้องตั้งค่าโดยใช้shoptตัวเลือกดังต่อไปนี้ ตัวเลือกจะเปิดใช้งานด้วยการ-sสนับสนุนและปิดการใช้งานด้วยเขา-uธง นอกจากนี้คุณสามารถใช้ตัวเลือกสองตัวเลือกมากกว่าเช่นnullglobที่ glob ที่ไม่ตรงกันถูกกวาดออกไปทั้งหมดแทนที่ด้วยชุดของคำศูนย์ และglobstarที่ช่วยให้สามารถเรียกคืนผ่านไดเรกทอรีทั้งหมด
shopt -s extglob nullglob globstar
ตอนนี้สิ่งที่คุณต้องทำคือสร้างรูปแบบ glob เพื่อรวมไฟล์ของส่วนขยายที่แน่นอนซึ่งคุณสามารถทำได้ดังต่อไปนี้ เราใช้อาร์เรย์เพื่อเติมผลลัพธ์ glob เพราะเมื่อยกมาอย่างถูกต้องและขยายชื่อไฟล์ที่มีตัวอักษรพิเศษจะยังคงไม่บุบสลายและไม่แตกเนื่องจากการแยกคำโดยเชลล์
ตัวอย่างเช่นเพื่อแสดงรายการ*.csvไฟล์ทั้งหมดในเส้นทางแบบเรียกซ้ำ
fileList=(**/*.csv)
ตัวเลือก**คือการเรียกคืนผ่านโฟลเดอร์ย่อยและ*.csvเป็นส่วนขยายแบบกลมเพื่อรวมไฟล์ของส่วนขยายที่กล่าวถึง ตอนนี้สำหรับการพิมพ์ไฟล์จริงเพียงทำ
printf '%s\n' "${fileList[@]}"
การใช้อาร์เรย์และทำการขยายที่ถูกต้องเป็นวิธีที่ถูกต้องเมื่อใช้ในเชลล์สคริปต์ แต่สำหรับการใช้แบบโต้ตอบคุณสามารถใช้lsกับนิพจน์ glob ได้
ls -1 -- **/*.csv
สิ่งนี้สามารถขยายได้มากเพื่อให้ตรงกับไฟล์หลาย ๆ ไฟล์เช่นไฟล์ที่ลงท้ายด้วยนามสกุลหลายไฟล์ (เช่นคล้ายกับการเพิ่มfindคำสั่งหลายแฟล็กในคำสั่ง) ยกตัวอย่างเช่นพิจารณากรณีที่จำเป็นต้องได้รับไฟล์ภาพ recursive ทั้งหมดคือส่วนขยาย*.gif, *.pngและ*.jpgสิ่งที่คุณจำเป็นต้องมี
ls -1 -- **/+(*.jpg|*.gif|*.png)
สิ่งนี้สามารถขยายได้เป็นอย่างดีเพื่อให้ได้ผลลัพธ์ที่ไม่ดีเช่นกัน ด้วยไวยากรณ์เดียวกันเราสามารถใช้ผลลัพธ์ของ glob เพื่อแยกไฟล์บางประเภท สมมติว่าคุณต้องการยกเว้นชื่อไฟล์ด้วยนามสกุลด้านบนคุณสามารถทำได้
excludeResults=()
excludeResults=(**/!(*.jpg|*.gif|*.png))
printf '%s\n' "${excludeResults[@]}"
โครงสร้าง!()คือการดำเนินการเชิงลบที่จะไม่รวมนามสกุลไฟล์ใด ๆ ที่อยู่ในรายการและ|เป็นตัวดำเนินการสำรองเช่นเดียวกับที่ใช้ในไลบรารี Extended Regular Expressions เพื่อทำการจับคู่ OR ของ globs
หมายเหตุว่าสิ่งเหล่านี้สนับสนุนการขยาย glob ไม่สามารถใช้ได้ในบอร์นเชลล์ POSIX bashและหมดจดเฉพาะกับรุ่นล่าสุดของ ดังนั้นหากคุณกำลังพิจารณาความสามารถในการพกพาของสคริปต์ที่ทำงานบน POSIX และbashเชลล์ตัวเลือกนี้จะไม่ถูกต้อง