Saya punya misalnya TREE.wav, ONE.WAV. Saya ingin mengganti namanya menjadi tree.wav, one.wav. Bagaimana cara mengganti nama semua file menjadi huruf kecil?
Saya punya misalnya TREE.wav, ONE.WAV. Saya ingin mengganti namanya menjadi tree.wav, one.wav. Bagaimana cara mengganti nama semua file menjadi huruf kecil?
Jawaban:
Jika Anda merasa nyaman dengan terminal:
cd
lalu seret dan jatuhkan Folder yang berisi berkas yang akan diubah namanya ke dalam jendela.ls
dan tekan enter.Tempel kode ini dan tekan enter:
for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
ls
dan tekan enter lagi.(Terima kasih kepada @bavarious di twitter untuk beberapa perbaikan, dan terima kasih kepada John Whitley di bawah karena telah membuat ini lebih aman pada sistem file yang tidak peka huruf besar / kecil.)
foo.txt
dan FOO.TXT
, ini dapat merusak salah satunya.
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
Pertanyaan yang ditanyakan bersifat umum, dan juga penting, jadi saya ingin memberikan jawaban yang lebih umum:
Kasus paling sederhana (sebagian besar aman, dan di Mac OS X, tapi baca terus):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Anda juga perlu menangani spasi dalam nama file (OS apa pun):
IFS=$'\n' ; for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; mv "$i" "$j" ; done
Anda perlu menangani nama file dengan aman yang berbeda hanya berdasarkan kasus dalam sistem file yang case-sensitive dan tidak menimpa target (misalnya Linux):
for i in * ; do j=$(tr '[:upper:]' '[:lower:]' <<< "$i") ; [ -e "$j" ] && continue ; mv "$i" "$j" ; done
Catatan tentang Mac OS X:
Sistem file Mac peka huruf besar kecil, mempertahankan huruf besar-kecil.
Namun, tidak perlu membuat file sementara, seperti yang disarankan dalam jawaban dan komentar yang diterima, karena dua nama file yang berbeda hanya berdasarkan kasus tidak dapat ada di tempat pertama, ref .
Untuk menunjukkan ini:
$ 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