แม้ว่าการใช้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
เชลล์ตัวเลือกนี้จะไม่ถูกต้อง