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. rename
tidak tersedia, dan banyak variasi find
gagal karena tampaknya tetap menggunakan nama lama dari jalur yang sudah diganti nama (mis., jika ditemukan ./FOO
diikuti oleh ./FOO/BAR
, penggantian nama ./FOO
ke ./foo
akan tetap berlanjut ke daftar ./FOO/BAR
meskipun 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/bar
sebelumnya ./foo
), tetapi hanya untuk file yang berisi karakter huruf besar. The -name
Filter hanya berlaku untuk nama file base, bukan path lengkap. Jadi ini akan mencantumkan ./FOO/BAR
tetapi 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 -depth
penting).
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 find
dan memformatnya dalam mv
perintah menggunakan ekspresi reguler. The -n
pilihan berhenti sed
dari mencetak input, dan p
perintah 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 find
output ./FOO/BAR
, itu akan menjadi mv -n -v -T ./FOO/BAR ./FOO/bar
. The -n
pilihan mv
merek yakin ada file huruf kecil tidak ditimpa. The -v
pilihan membuat mv
output setiap perubahan yang membuat (atau tidak membuat - jika ./FOO/bar
sudah ada, itu output sesuatu seperti ./FOO/BAR -> ./FOO/BAR
, mencatat bahwa tidak ada perubahan telah dibuat). Ini -T
sangat penting di sini - ini memperlakukan file target sebagai direktori. Ini akan memastikan bahwa ./FOO/BAR
tidak dipindahkan ke ./FOO/bar
jika direktori itu ada.
Gunakan ini bersama-sama dengan find
untuk menghasilkan daftar perintah yang akan dieksekusi (berguna untuk memverifikasi apa yang akan dilakukan tanpa benar-benar melakukannya)
sh
Cukup jelas. Ini merutekan semua mv
perintah yang dihasilkan ke shell interpreter. Anda dapat menggantinya dengan bash
atau kulit apa pun yang Anda suka.
ABCdef
,abcDEF
danaBcDeF
? 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