ในสคริปต์ทุบตีฉันจะพูดว่า 'สำหรับไฟล์ประเภท. png หรือ .PNG ทั้งหมดได้อย่างไร'
ฉันกำลังพยายาม:
for i in (`ls *.PNG` && `ls *.png`)
แต่ได้รับข้อผิดพลาดทางไวยากรณ์
ในสคริปต์ทุบตีฉันจะพูดว่า 'สำหรับไฟล์ประเภท. png หรือ .PNG ทั้งหมดได้อย่างไร'
ฉันกำลังพยายาม:
for i in (`ls *.PNG` && `ls *.png`)
แต่ได้รับข้อผิดพลาดทางไวยากรณ์
คำตอบ:
หากคุณต้องการชุดค่าผสมที่เป็นไปได้ทั้งหมดให้ใช้:
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 หรือการตรวจสอบการมีอยู่ของไฟล์ที่ตรงกันทั้งหมดเช่นนี้ในกรณีที่ไม่มีการแข่งขัน
คุณสามารถลองใช้สายการบินเดียวเช่น
หา - ชื่อ "* .png" -exec ....
หรือ
หา - ชื่อ "* .png" | xargs ....
แก้ไข
ดูความคิดเห็นของ @ Yab ด้านล่างเกี่ยวกับการเรียกซ้ำ
find -maxdepth 1 -iname "*.png"
ls
เกือบจะไร้ประโยชน์ที่นี่ แต่สำหรับบันทึกที่นี่เป็นไวยากรณ์ที่ใกล้ความพยายามของคุณ:
for i in $(ls *.PNG ; ls *.png)
หมายเหตุ:
for i in *.{png,PNG}