[Shell Script] Rename Multiple Files with Shell Script

วันนี้มีโจทย์คือ ต้องการเปลี่ยนชื่อ File หลายๆ ไฟล์ให้เป็นแนวทางเดียวกัน
โดยที่มีการติด Postfix Number ไว้ด้านท้ายด้วย ...

แต่เราเป็น Programmer นี่ครับ ... คิดหรอว่าจะมานั่งคลิกขวาแล้วกด Rename มันทีละไฟล์
เหนื่อยน่าดูนะ ... เขียนโปรแกรมเป็นก็ต้องทำให้เกิดประโยชน์ :)
Rename Multiple Files with Shell Script:
$ index=1 ; for file in *.jpg ; do mv "$file" "newName$((index++)).jpg" ; done
สาธยายกันนิดนึงเกี่ยวกับ Shell Command ว่าเราเปลี่ยนชื่อไฟล์ทุกๆ ไฟล์ได้อย่างไร
index=1
** เวลาประกาศตัวแปรและอ้างอิงค่า ห้ามมี " " (space) เนื่องจาก shell จะตัด Token ที่ space (เราจะสังเกตุได้ว่าคำสั่งหรือชื่อไฟล์ต่างๆ บน Unix จะไม่มี space) ดังนั้น `index = 1` และ `index=1` จึงไม่เหมือนกัน
for file in *.jpg
เนื่องจากผมใช้ wildcard `*.jpg` ซึ่งเครื่องหมาย * (Asterisk) เป็นตัวบอกว่า จะเป็นชื่ออะไรก็ได้ กี่ตัวก็ได้ ... (แต่กำหนดนามสกุลเป็น jpg) ดังนั้น wildcard นี้จะให้ List ของไฟล์ทุกไฟล์ที่มีนามสกุล .jpg ที่อยู่ใน Directory ปัจจุบัน

ส่วนหลักการของ Loops ก็เป็น foreach ปกติ
do mv "$file" "newName$((index++)).jpg"
เราใช้ $variableName ในการอ้างถึงค่าของตัวแปร

อันนี้น่าจะคุ้ยเคยกันอยู่แล้ว สำหรับคนที่ใช้ Shell Command อยู่บ่อยๆ mv (Move) เนื่องจากเราไม่มีคำสั่ง Rename ตรงๆ หรอกครับ ... ดังนั้นถ้าจะเปลี่ยนชื่อเราก็แค่ ย้ายของเดิม ไปเป็นของใหม่ด้วยชื่อใหม่ซะ

** ตรง index++ เราจะเห็นว่าต้องใช้ (()) (Double Bracket) ในการเข้าถึงตัวแปรที่มี Operation นั่นเป็นเพราะ $( ... ) หมายถึงให้ทำ Command ย่อยๆ ครับ ดังนั้นเวลาเราจะเข้าถึงตัวแปรต้องใช้ (()) เพื่อไม่ให้ Parser มันงง
done
เป็นคำสั่งที่ต้องเขียนปิดท้ายทุกครั้ง เวลาเขียน Shell Script เพื่อบอกจุดจบการทำงานของโปรแกรม
แค่นี้เองครับ :) ทำเรื่องยากๆ ให้กลายเป็นเรื่องง่ายๆ สิ

ขอบคุณ @neizod และ @nattster ที่ให้ข้อแนะนำในการใช้ Shell Script


Popular posts from this blog

12 วิธี การบริการและดูแลลูกค้าในร้าน Starbucks

[Android Dev] การติดตั้ง Eclipse+AndroidSDK เพื่อพัฒนาโปรแกรมบน Android

"อีสุกอีใส" ประสบการณ์เมื่อต้องมาเป็นตอนอายุ 22