Perhatikan bahwa Anda menggunakan skrip Perl yang disebutrename
didistribusikan oleh Debian dan turunannya (Ubuntu, Mint, ...). Distribusi Linux lainnya mengirimkan perintah yang sama sekali berbeda, dan sangat tidak berguna, disebut rename
.
y/A-Z/a-z/
menerjemahkan setiap karakter dalam kisaran A
melalui Z
ke dalam sesuai karakter dalam kisaran a
melalui z
, yaitu ASCII huruf besar huruf ke huruf kecil yang sesuai. Untuk melakukan terjemahan yang berlawanan, gunakan y/a-z/A-Z/
. Cara lain untuk menulis perintah yang sama adalah rename '$_ = uc($_)' *
- uc
adalah fungsi u pper c ase, dan rename
perintah mengganti nama file berdasarkan transformasi yang dibuat ke $_
variabel.
rename '…' *
hanya mengganti nama file di direktori saat ini, karena itulah yang *
cocok. File dot (file yang namanya dimulai dengan .
) dilewati juga.
Jika Anda ingin mengganti nama file di direktori saat ini dan di subdirektori secara rekursif, Anda dapat menggunakan find
perintah untuk melintasi direktori saat ini secara rekursif. Ada kesulitan di sini: jika Anda menelepon rename
, ini mengganti nama direktori dan bagian nama dasar. Jika Anda memanggil rename
direktori sebelum berulang ke dalamnya ( find -exec rename … {} \;
), find
menjadi bingung karena menemukan direktori tetapi direktori itu tidak ada lagi pada saat ia mencoba turun ke dalamnya. Anda bisa menyiasatinya dengan mengatakan find
untuk melintasi direktori sebelum bertindak di atasnya, tapi kemudian Anda berakhir mencoba untuk mengubah nama foo/bar
ke FOO/BAR
tetapi direktori FOO
tidak ada.
Cara sederhana untuk menghindari kesulitan ini adalah membuat perintah pengubahan nama hanya bertindak pada bagian nama dasar dari path. Ekspresi reguler ([^/]*\Z)
cocok dengan bagian akhir dari jalur yang tidak mengandung a /
.
find . -depth -exec rename 's!([^/]*\Z)!uc($1)!e' {} +
Shell zsh menyediakan fitur yang lebih nyaman untuk penggantian nama - bahkan lebih samar dari Perl, tetapi lebih singkat dan seringkali lebih mudah untuk dikomposisi.
Fungsi zmv
mengubah nama file berdasarkan pola. Jalankan autoload -U zmv
sekali untuk mengaktifkannya (masukkan baris ini di Anda .zshrc
).
Dalam argumen pertama ke zmv
(pola untuk mengganti), Anda dapat menggunakan pola wildcard zsh yang kuat . Dalam argumen kedua ke zmv
(teks pengganti), Anda dapat menggunakan fitur ekspansi parameternya , termasuk pengubah riwayat .
zmv -w '**/*' '$1$2:u'
Penjelasan:
-w
- Otomatis menetapkan variabel numerik untuk setiap pola wildcard
**/*
- semua file dalam subdirektori, secara rekursif ( **/
cocok dengan 0, 1 atau lebih level subdirektori)
$1
- variabel numerik pertama, di sini cocok dengan bagian direktori dari setiap jalur
$2:u
- variabel numerik kedua, di sini mencocokkan bagian nama dasar dari setiap jalur, dengan :u
pengubah untuk mengkonversi nilai menjadi huruf besar
Sebagai bonus tambahan, ini menghormati pengaturan lokal sekitar.
Jika Anda tidak yakin tentang zmv
perintah yang Anda tulis, Anda dapat memberikan -n
opsi untuk mencetak apa yang akan dilakukan perintah dan tidak mengubah apa pun. Periksa output, dan jika itu melakukan apa yang Anda inginkan, jalankan kembali perintah tanpa -n
benar-benar bertindak.
rename 'y/a-z/A-Z/' *
Anda akan mendapatkan apa yang Anda inginkan. Hati-hati saat Anda mengujinya.