ฉันจะเปลี่ยนชื่อไฟล์ทั้งหมดเป็นตัวพิมพ์เล็กได้อย่างไร


123

ฉันมีตัวอย่างเช่น TREE.wav, ONE.WAV ฉันต้องการเปลี่ยนชื่อเป็น tree.wav, one.wav ฉันจะเปลี่ยนชื่อไฟล์ทั้งหมดเป็นตัวพิมพ์เล็กได้อย่างไร


1
คุณพอใจกับโซลูชัน Terminal / shell หรือไม่? หรือคุณต้องการให้รหัส C / Objective-C ทำสิ่งนั้นให้สำเร็จ?

ทางออกของเทอร์มินัลจะโอเค
Voloda2

3
ฉันคิดว่านี่ควรจะเปิดใหม่ รหัสเทอร์มินัลเป็นรหัสเช่นกัน
Danield

1
นี่ควรเป็นคำถามที่ถูกต้องใน stackoverflow นี่คือรหัสด้วย
adev

คำตอบ:


371

หากคุณพอใจกับเครื่องปลายทาง:

  1. เปิด Terminal.app พิมพ์cdแล้วลากและวางโฟลเดอร์ที่มีไฟล์ที่จะเปลี่ยนชื่อลงในหน้าต่าง
  2. เพื่อยืนยันว่าคุณอยู่ในไดเร็กทอรีที่ถูกต้องพิมพ์lsและกด Enter
  3. วางรหัสนี้แล้วกด Enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. เพื่อยืนยันว่าไฟล์ทั้งหมดของคุณลดขนาดลงให้พิมพ์lsและกด Enter อีกครั้ง

(ขอบคุณ @bavarious บน twitter สำหรับการแก้ไขเล็กน้อยและขอบคุณ John Whitley ด้านล่างที่ทำให้ระบบนี้ปลอดภัยยิ่งขึ้นในระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่)


9
ระวัง. หากคุณมีไฟล์ที่ตั้งชื่อfoo.txtและFOO.TXTสิ่งนี้อาจทำให้เป็นหนึ่งในไฟล์นั้นได้
Keith Thompson

1
ด้วยการทุบตีคุณสามารถทำได้: mv "$f" "${f,,}"หรือdeclare -l g=$f; mv "$f" "$g"
glenn jackman

2
ฉันลองใช้คำสั่งเหล่านี้ทั้งหมดฉันได้รับ "mv: 'PPP.txt' และ 'ppp.txt' เป็นไฟล์เดียวกัน" และไฟล์ของฉันไม่เป็นตัวพิมพ์เล็ก ... เป็นเพราะอยู่ในไดเร็กทอรีเดียวกันหรือไม่?
lorless

1
user2066039: สิ่งนี้ต้องเป็นสิ่งล่าสุดบน Mac เพราะคำตอบส่วนใหญ่ที่เก่ากว่าหนึ่งปีไม่ได้คำนึงถึงมัน ฉันทำงานให้สำเร็จโดยใช้ส่วนขยายระดับกลางเช่น 'jpg1' ดังนั้น JPG -> jpg1 -> jpg หวังว่าจะช่วยได้
Joyce

14
ผู้ใช้ OS X ควรเปลี่ยนชื่อไฟล์แต่ละไฟล์เป็นชื่อชั่วคราวก่อนเนื่องจากระบบไฟล์ที่ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่เช่น for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley

10

คำถามที่ถามเป็นเรื่องทั่วไปและสำคัญเช่นกันดังนั้นฉันต้องการให้คำตอบที่กว้างขึ้น:

กรณีที่ง่ายที่สุด (ปลอดภัยเกือบตลอดเวลาและบน 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

ใช่ - แต่ตัวอย่างของคุณแนะนำว่าคุณสามารถพิมพ์ชื่อไฟล์โดยใช้ "mv X ​​x" ดังนั้นจึงเป็นเพียงที่ฉันแสดงความคิดเห็น
cpaludan

mojave 10.14.5: # touch X x # ls -la ทั้งหมด 0 -rw-r - r-- 1 รูท 0 มิ.ย. 24 15:19 X # mv X x mv: 'X' และ 'x' เหมือนกัน file # ls -la -rw-r - r-- 1 root root 0 มิ.ย. 24 15:19 X
cpaludan

ขออภัยสำหรับการจัดรูปแบบที่ผิดเพี้ยน ดังนั้นไม่ได้ใจดีกับฉันที่นั่น
cpaludan

1
และไม่ดีของฉัน - อยู่ใน ssh บนราสเบอร์รี่ของฉันบนไดรฟ์ที่แชร์ (ฟอร์แมต hfsplus) - มันใช้ไม่ได้ แต่ในเครื่อง Mac ของฉันมันทำได้
cpaludan

สำหรับฉันใน *; ทำ j = $ (tr '[: upper:]' '[: lower:]' <<< "$ i"); mv "$ i" "$ j"; ทำงานให้ฉันที่ catalina ขอบคุณ
Sinan Eldem

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.