หนึ่งซับที่สามารถพิมพ์ได้ง่ายจากเทอร์มินัล:
for f in *.md; do mv "$f" "test - $f"; done
หรือเขียนใหม่ในบรรทัดที่แยกกันแทนการใช้เครื่องหมายอัฒภาค:
for f in *.md
do
mv "$f" "test - $f"
done
นิทรรศการ
ไวยากรณ์ของfor
(ในsh
):
for NAME [in WORDS ... ] ; do COMMANDS; done
ที่นี่เราNAME
เป็นf
ของเราและเป็นไฟล์ทั้งหมดที่อยู่ในการจับคู่ไดเรกทอรีปัจจุบันWORDS
*.md
ดังนั้นตัวแปรจะถูกแทนที่ด้วยการจับคู่แต่ละไฟล์$f
*.md
ดังนั้นสำหรับa.md
:
mv "$f" "test - $f"
กลายเป็น
mv "a.md" "test - a.md"
เครื่องหมายคำพูดมีความสำคัญเนื่องจากชื่อไฟล์แต่ละรายการ$f
อาจมีช่องว่าง มิฉะนั้นmv
จะคิดว่าแต่ละคำเป็นไฟล์แยกต่างหาก ตัวอย่างเช่นหากไม่มีเครื่องหมายคำพูดและมีไฟล์ที่เรียกว่าFoo Bar.md
มันจะแปลเป็น:
mv Foo Bar.md test - Foo Bar.md
ซึ่งจะไม่ทำงานตามที่ตั้งใจไว้ แต่ด้วยการห่อ$f
คำพูดมันสมเหตุสมผล:
mv "Foo Bar.md" "test - Foo Bar.md"
สังเกตไวยากรณ์ของfor
คุณยังสามารถเปลี่ยนชื่อชุดย่อยของ*.md
ไฟล์ทั้งหมดโดยการตั้งชื่อแต่ละอย่างชัดเจน:
for f in a.md b.md d.md; do mv "$f" "Test - $f"; done
หรือใช้การขยายเชลล์:
for f in {a,b,d}.md; do mv "$f" "Test - $f"; done