find . -depth -name '*[A-Z]*'|sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'|sh
Saya belum mencoba skrip yang lebih rumit yang disebutkan di sini, tetapi tidak ada versi commandline tunggal yang bekerja untuk saya di NAS Synology saya. renametidak tersedia, dan banyak variasi findgagal karena tampaknya tetap menggunakan nama lama dari jalur yang sudah diganti nama (mis., jika ditemukan ./FOOdiikuti oleh ./FOO/BAR, penggantian nama ./FOOke ./fooakan tetap berlanjut ke daftar ./FOO/BARmeskipun jalur itu tidak lagi valid) . Perintah di atas bekerja untuk saya tanpa masalah.
Berikut ini adalah penjelasan dari setiap bagian dari perintah:
find . -depth -name '*[A-Z]*'
Ini akan menemukan file apa pun dari direktori saat ini (ubah .ke direktori apa pun yang ingin Anda proses), menggunakan pencarian kedalaman-pertama (mis., Ia akan mendaftar ./foo/barsebelumnya ./foo), tetapi hanya untuk file yang berisi karakter huruf besar. The -nameFilter hanya berlaku untuk nama file base, bukan path lengkap. Jadi ini akan mencantumkan ./FOO/BARtetapi tidak ./FOO/bar. Ini tidak masalah, karena kami tidak ingin mengganti nama ./FOO/bar. Kami ingin mengubah nama ./FOO, tetapi yang terdaftar nanti (inilah mengapa -depthpenting).
Perintah ini dengan sendirinya sangat berguna untuk menemukan file yang ingin Anda ganti namanya sejak awal. Gunakan ini setelah perintah ganti nama lengkap untuk mencari file yang masih belum diganti karena tabrakan atau kesalahan nama file.
sed -n 's/\(.*\/\)\(.*\)/mv -n -v -T \1\2 \1\L\2/p'
Bagian ini membaca file yang dihasilkan oleh finddan memformatnya dalam mvperintah menggunakan ekspresi reguler. The -npilihan berhenti seddari mencetak input, dan pperintah dalam pencarian dan mengganti output regex teks diganti.
Regex itu sendiri terdiri dari dua tangkapan: bagian atas / terakhir (yang merupakan direktori file), dan nama file itu sendiri. Direktori dibiarkan utuh, tetapi nama file diubah menjadi huruf kecil. Jadi, jika findoutput ./FOO/BAR, itu akan menjadi mv -n -v -T ./FOO/BAR ./FOO/bar. The -npilihan mvmerek yakin ada file huruf kecil tidak ditimpa. The -vpilihan membuat mvoutput setiap perubahan yang membuat (atau tidak membuat - jika ./FOO/barsudah ada, itu output sesuatu seperti ./FOO/BAR -> ./FOO/BAR, mencatat bahwa tidak ada perubahan telah dibuat). Ini -Tsangat penting di sini - ini memperlakukan file target sebagai direktori. Ini akan memastikan bahwa ./FOO/BARtidak dipindahkan ke ./FOO/barjika direktori itu ada.
Gunakan ini bersama-sama dengan finduntuk menghasilkan daftar perintah yang akan dieksekusi (berguna untuk memverifikasi apa yang akan dilakukan tanpa benar-benar melakukannya)
sh
Cukup jelas. Ini merutekan semua mvperintah yang dihasilkan ke shell interpreter. Anda dapat menggantinya dengan bashatau kulit apa pun yang Anda suka.
ABCdef,abcDEFdanaBcDeF? Haruskah script rename dibatalkan atau hanya diperingatkan dan dilanjutkan? 2. Bagaimana Anda mendefinisikan huruf kecil untuk nama yang bukan US-ASCII? Jika nama-nama tersebut mungkin ada, haruskah salah satu memeriksa dan mengecualikan pass dilakukan terlebih dahulu? 3. Jika Anda menjalankan operasi ganti nama