ฉันมีตัวอย่างเช่น TREE.wav, ONE.WAV ฉันต้องการเปลี่ยนชื่อเป็น tree.wav, one.wav ฉันจะเปลี่ยนชื่อไฟล์ทั้งหมดเป็นตัวพิมพ์เล็กได้อย่างไร
ฉันมีตัวอย่างเช่น TREE.wav, ONE.WAV ฉันต้องการเปลี่ยนชื่อเป็น tree.wav, one.wav ฉันจะเปลี่ยนชื่อไฟล์ทั้งหมดเป็นตัวพิมพ์เล็กได้อย่างไร
คำตอบ:
หากคุณพอใจกับเครื่องปลายทาง:
cd
แล้วลากและวางโฟลเดอร์ที่มีไฟล์ที่จะเปลี่ยนชื่อลงในหน้าต่างls
และกด Enterวางรหัสนี้แล้วกด Enter:
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
ls
และกด Enter อีกครั้ง(ขอบคุณ @bavarious บน twitter สำหรับการแก้ไขเล็กน้อยและขอบคุณ John Whitley ด้านล่างที่ทำให้ระบบนี้ปลอดภัยยิ่งขึ้นในระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่)
foo.txt
และFOO.TXT
สิ่งนี้อาจทำให้เป็นหนึ่งในไฟล์นั้นได้
mv "$f" "${f,,}"
หรือdeclare -l g=$f; mv "$f" "$g"
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
คำถามที่ถามเป็นเรื่องทั่วไปและสำคัญเช่นกันดังนั้นฉันต้องการให้คำตอบที่กว้างขึ้น:
กรณีที่ง่ายที่สุด (ปลอดภัยเกือบตลอดเวลาและบน Mac OS X แต่อ่านต่อ):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
คุณต้องจัดการช่องว่างในชื่อไฟล์ด้วย (ระบบปฏิบัติการใด ๆ ):
IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
คุณต้องจัดการชื่อไฟล์ที่แตกต่างกันอย่างปลอดภัยในระบบไฟล์ที่คำนึงถึงตัวพิมพ์เล็กและใหญ่และไม่เขียนทับเป้าหมาย (เช่น Linux):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done
หมายเหตุเกี่ยวกับ Mac OS X:
ระบบไฟล์ของ Mac ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่
มี แต่ไม่จำเป็นต้องสร้างไฟล์ชั่วคราวตามข้อเสนอแนะในคำตอบที่ได้รับการยอมรับและแสดงความคิดเห็นเพราะสองชื่อไฟล์ที่แตกต่างกันโดยเฉพาะกรณีที่ไม่สามารถอยู่ในสถานที่แรกที่เตะ
เพื่อแสดงสิ่งนี้:
$ mkdir test
$ cd test
$ touch X x
$ ls -l
total 0
-rw-r--r-- 1 alexharvey wheel 0 26 Sep 20:20 X
$ mv X x
$ ls -l
total 0
-rw-r--r-- 1 alexharvey wheel 0 26 Sep 20:20 x
รุ่นเปลือกปลา:
for old in *
set new (echo $old | tr '[A-Z]' '[a-z]')
mv $old $new
end