Bash shell: แสดงรายการไฟล์ทุกประเภท. png หรือ. PNG?


14

ในสคริปต์ทุบตีฉันจะพูดว่า 'สำหรับไฟล์ประเภท. png หรือ .PNG ทั้งหมดได้อย่างไร'

ฉันกำลังพยายาม:

for i in (`ls *.PNG` && `ls *.png`)

แต่ได้รับข้อผิดพลาดทางไวยากรณ์

คำตอบ:


18

หากคุณต้องการชุดค่าผสมที่เป็นไปได้ทั้งหมดให้ใช้:

for i in *.[Pp][Nn][Gg]; do

หรือ

shopt -s nocaseglob
for i in *.png; do

แต่ที่ใครจะทำให้ทุกสคริปต์ของคุณ globs เปลือก (เช่นไม้ขีดไฟไฟล์สัญลักษณ์แทน) shopt -u nocaseglobกรณีตายจนกว่าคุณจะทำงาน

หากคุณต้องการเพียงแค่. PNG และ. png (และไม่ใช่เช่น. PnG หรือ. pnG) ให้ใช้อย่างใดอย่างหนึ่ง

shopt -s nullglob
for i in *.png *.PNG; do

หรือ

for i in *.png *.PNG; do
    [[ -e "$i" ]] || continue

... เหตุผลของการตรวจสอบ nullglob หรือการมีอยู่คือถ้าคุณมีส่วนขยายตัวพิมพ์เล็กหรือตัวพิมพ์ใหญ่เท่านั้นมันจะรวมรูปแบบที่ไม่ตรงกันในรายการของไฟล์ซึ่งนำไปสู่ข้อผิดพลาดในเนื้อความของลูป เช่นเดียวกับ nocaseglob คุณอาจต้องการปิดตัวเลือก nullglob shell หลังจากนั้น (แม้ว่าในประสบการณ์ของฉันที่มี nullglob บนมักจะดีโดยเฉพาะอย่างยิ่งในสคริปต์) ที่จริงแล้วฉันคิดว่าควรใช้ nocaseglob หรือการตรวจสอบการมีอยู่ของไฟล์ที่ตรงกันทั้งหมดเช่นนี้ในกรณีที่ไม่มีการแข่งขัน


5
for i in *.{png,PNG}
เกล็นแจ็

@glenn: นั่นก็ใช้ได้เหมือนกัน (เทียบเท่ากับ `* .png * .PNG) แม้ว่าคุณจะยังต้องการ nullglob หรือตรวจสอบการมีอยู่
Gordon Davisson

5

คุณสามารถลองใช้สายการบินเดียวเช่น

หา - ชื่อ "* .png" -exec ....

หรือ

หา - ชื่อ "* .png" | xargs ....

แก้ไข
ดูความคิดเห็นของ @ Yab ด้านล่างเกี่ยวกับการเรียกซ้ำ


1
อย่างไรก็ตามการค้นหาเป็นค่าเริ่มต้นซึ่งเรียกซ้ำดังนั้นเพื่อให้ได้ผลลัพธ์เดียวกันกับคำถามที่ถามคุณต้องทำ find -maxdepth 1 -iname "*.png"
Yab

@ ใช่คุณถูกต้องสมบูรณ์แบบ ฉันมองข้ามแง่มุมนี้
Alain Pannetier

1

ls เกือบจะไร้ประโยชน์ที่นี่ แต่สำหรับบันทึกที่นี่เป็นไวยากรณ์ที่ใกล้ความพยายามของคุณ:

for i in $(ls *.PNG ; ls *.png)

หมายเหตุ:

  • ฉันสมมติว่าคุณต้องการทั้งตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก ตัวคั่น && จะหมายถึงการประมวลผลไฟล์ png เฉพาะเมื่อมีไฟล์ PNG อยู่ซึ่งอาจไม่สมเหตุสมผลนัก
  • คุณจะมีข้อความแสดงข้อผิดพลาดหากไม่พบไฟล์ที่มีทั้งลวดลาย
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.