Bagaimana cara mengganti nama semua file menjadi huruf kecil?

123

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?

Voloda2
sumber
1
Apakah Anda merasa nyaman dengan solusi Terminal / shell? Atau apakah Anda ingin kode C / Objective-C melakukannya?
Solusi terminal akan baik-baik saja.
Voloda2
3
Saya pikir ini harus dibuka kembali. kode terminal adalah kode juga
Danield
1
Ini harus menjadi pertanyaan yang valid di stackoverflow. Ini juga kode.
adev

Jawaban:

371

Jika Anda merasa nyaman dengan terminal:

  1. Buka Terminal.app, ketik cdlalu seret dan jatuhkan Folder yang berisi berkas yang akan diubah namanya ke dalam jendela.
  2. Untuk mengonfirmasi Anda berada di direktori yang benar, ketik lsdan tekan enter.
  3. Tempel kode ini dan tekan enter:

    for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
  4. Untuk mengonfirmasi bahwa semua file Anda menggunakan huruf kecil, ketik lsdan 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.)

wjl
sumber
9
Hati-hati. Jika Anda memiliki file bernama foo.txtdan FOO.TXT, ini dapat merusak salah satunya.
Keith Thompson
1
Dengan bash, Anda dapat melakukan mv "$f" "${f,,}"declare -l g=$f; mv "$f" "$g"
:,
2
saya mencoba semua perintah ini, saya mendapatkan "mv: 'PPP.txt' dan 'ppp.txt' adalah file yang sama" dan tidak menurunkan huruf kecil file saya ... ada ide? Apakah karena di direktori yang sama?
lorless
1
user2066039: Ini pasti hal terbaru di Mac, karena sebagian besar jawaban yang lebih lama dari satu tahun tidak memperhitungkannya. Saya menyelesaikan tugas dengan menggunakan ekstensi perantara seperti 'jpg1'. Jadi, JPG -> jpg1 -> jpg. Semoga membantu.
Joyce
14
Pengguna OS X harus mengganti nama setiap file menjadi nama sementara terlebih dahulu karena sistem file tidak peka huruf besar / kecil, misalnya: for f in *; do mv "$f" "$f.tmp"; mv "$f.tmp" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done
John Whitley
10

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
Alex Harvey
sumber
Ya - tetapi contoh Anda menunjukkan bahwa Anda dapat menggunakan huruf kecil nama file menggunakan 'mv X x'. Jadi hanya itu yang saya komentari.
cpaludan
mojave 10.14.5: # sentuh X x # ls -la total 0 -rw-r - r-- 1 root root 0 Jun 24 15:19 X # mv X x mv: 'X' dan 'x' sama file # ls -la -rw-r - r-- 1 root root 0 24 Jun 15:19 X
cpaludan
Maaf untuk format yang jelek. JADI tidak baik padaku di sana.
cpaludan
1
Dan saya buruk - berada di ssh di raspberry saya di drive bersama (diformat hfsplus) - di sana tidak berhasil. Tapi secara lokal di mac saya itu.
cpaludan
untuk saya di *; do j = $ (tr '[: upper:]' '[: lower:]' <<< "$ i"); mv "$ i" "$ j"; bekerja untuk saya di catalina. Terima kasih.
Sinan Eldem
2

Versi cangkang ikan:

for old in *
    set new (echo $old | tr '[A-Z]' '[a-z]')
    mv $old $new
end
arsenius
sumber