วิธีรับสตริงว่างจากรูปแบบ glob แบบไม่มีการโต้ตอบ


24

ว่าฉันมีโฟลเดอร์ที่มีสามไฟล์:

foo1
foo2
bar

1. ถ้าฉันวิ่ง

list_of_files=$(print foo*)
echo $list_of_files

ฉันเข้าใจ: foo1 foo2

2.ถ้าฉันวิ่ง

list_of_files=$(print bar*)
echo $list_of_files

ฉันเข้าใจ: bar

3.อย่างไรก็ตามถ้าฉันวิ่ง

list_of_files=$(print other*)
echo $list_of_files

ฉันได้รับ: zsh: no matches found: other*(ตัวแปร$list_of_filesว่างเปล่าแม้ว่า)


มีวิธีที่จะขอให้ zsh ไม่บ่นถ้ามันไม่ตรงกับการขยายตัวของ glob?

เป้าหมายของฉันคือการใช้กลไกดังกล่าวข้างต้นไปอย่างเงียบ ๆเก็บรวบรวมรายชื่อของไฟล์ที่ตรงกับรูปแบบ glob ที่กำหนด

คำตอบ:


33

เปิดnull_globตัวเลือกสำหรับรูปแบบของคุณด้วยโปรแกรมขยายNรอบตัว

list_of_files=(*(N))

หากคุณกำลังทำสิ่งนี้กับรูปแบบทั้งหมดในสคริปต์หรือฟังก์ชั่นให้เปิดnull_globตัวเลือก:

setopt null_glob

คำตอบนี้มี bash และ ksh เทียบเท่า

อย่าใช้printหรือทดแทนคำสั่ง! ที่สร้างสตริงที่ประกอบด้วยชื่อไฟล์ที่มีช่องว่างระหว่างพวกเขาแทนที่จะเป็นรายการของสตริง (ดูการแยกคำคืออะไรทำไมมันมีความสำคัญในการเขียนโปรแกรมเชลล์? )


15

วิธีที่ดีกว่า: for a in *(.N); do ... ; done. ตัวเลือก N ทำให้ zsh ส่งรายการว่างสำหรับและจะทำซ้ำเป็นศูนย์ครั้ง

ระวังls *.foo(.N); เมื่อ ls ได้รับรายการอาร์กิวเมนต์ที่ว่างเปล่ามันจะแสดงรายการไฟล์ทั้งหมดแทนไม่มี นี่คือเหตุผลที่ฉันไม่ชอบ NULL_GLOB (หรือเทียบเท่า bash ของมัน): มันเปลี่ยนglobs ทั้งหมดและแบ่งสายได้อย่างง่ายดายเช่น ls


อยากเห็นคำตอบของคุณที่นี่ @arnt นี่คือสิ่งที่ฉันต้องการ
gtd

ทำไมถึง.อยู่ใน(.N)? คำตอบอื่น ๆ มี(N)ด้วยตัวเองความแตกต่างคืออะไร?
Michael Dorst

คำถามเกี่ยวกับไฟล์และ.จำกัด glob ให้ตรงกับไฟล์เท่านั้น
arnt

4

ฉันคิดว่าคุณกำลังมองหาNULL_GLOBตัวเลือก:

   NULL_GLOB (-G)
          If a pattern for filename generation has no matches, delete  the
          pattern  from  the  argument list instead of reporting an error.
          Overrides NOMATCH.

-1

ลองด้วยวิธีนี้:

list_of_files=$(print other*) 2>/dev/null

มันจะเปลี่ยนเส้นทางข้อผิดพลาดออกจาก stderr เพื่อ / dev / null และจะไม่แสดง


ไม่ได้ผลเลย
Pablo Olmos de Aguilera C.
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.