วิธีที่ดีที่สุดในการขยายรูปแบบ glob?


29

ฉันต้องการขยายรูปแบบ glob (เช่น../smth*/*หรือ/etc/cron*/) ลงในรายการไฟล์โดยทางโปรแกรม อะไรจะเป็นวิธีที่ดีที่สุดที่จะทำ?


2
*คุณไม่จำเป็นต้องทำอะไรเป็นพิเศษก็ไม่ได้พูด
Kevin

1
แม้ว่าคุณจะพยายามแยกมันใช้อาร์เรย์เหมือนคำตอบ
Kevin

คำตอบ:


40

เพียงปล่อยให้มันขยายตัวในด้านขวาของการประกาศอาร์เรย์:

list=(../smth*/)          # grab the list
echo "${#list[@]}"        # print array length
echo "${list[@]}"         # print array elements
for file in "${list[@]}"; do echo "$file"; done  # loop over the array


โปรดทราบว่าnullglobจำเป็นต้องตั้งค่าตัวเลือกเชลล์
ไม่ได้ตั้งค่าเริ่มต้น
มันป้องกันข้อผิดพลาดในกรณีที่ glob (หรือหนึ่งในหลาย globs) ไม่ตรงกับชื่อใด ๆ

ตั้งไว้ bashด้วย

shopt -s nullglob

หรือzshด้วย

setopt nullglob

และฉันจะพิมพ์รายการนั้นในภายหลังได้อย่างไร
Rogach

มันเป็นเพียงอาร์เรย์ปกติ คุณสามารถทำสิ่งที่คุณสามารถทำได้ด้วยอาร์เรย์ใด ๆ เพิ่มตัวอย่างบางส่วน
จัดการ

1
มีปัญหา หากรูปแบบไม่ตรงกับไฟล์มันจะพิมพ์ตัวเอง - ซึ่งไม่ดีมาก
Rogach

5
Ah, shopt -s nullglob แก้มัน
Rogach

1
@lindhe, และพารามิเตอร์เช่นเดียวกับที่ใช้สำหรับunsetopt setopt
จัดการ

0

ไม่จำเป็นต้องมีสิ่งที่ซับซ้อนมากเกินไป:

echo your/stuff*

มันไม่ทำงาน ตัวอย่างเช่น: TEST=$(echo your/stuff*) && eval \"$TEST\"จะส่งออก:your/stuff*: No such file or directory
เซบาสเตียน

@ เซบาสเตียนนี้เป็นปัญหา nullglob ดูข้างบน
Alexei Averchenko

1
ไม่ไม่ใช่ปัญหา nullglob การใช้อักขระ scape กำลังประเมินTESTตัวแปรเป็นสตริงรวมถึง*และไม่ถูกขยาย
เซบาสเตียน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.