Saat ini saya mencoba mengganti nama sekumpulan besar file dan telah menggunakan metode yang cukup rumit untuk melakukannya, seperti:
rename 's:(.*).MOV:$1.mov:g' *.MOV
rename 's:(.*).JPG:$1.jpg:g' *.JPG
Yang benar-benar ingin saya lakukan adalah dapat menggabungkan semua perintah ini menggunakan 'y' sed
operator. Terbukti, dengan menggunakan operator ini, Anda dapat mengubah item menjadi huruf kecil. Masalahnya adalah saya hanya perlu mengonversi ekstensi. Apakah ada cara untuk melakukan ini menggunakan perintah ini? Saya pada dasarnya perlu mengubah grup tangkapan dalam ekspresi berikut menjadi huruf kecil:^.+.(.+)$
. Apakah ada cara untuk melakukan ini? Saya agak baru dalam transformasi semacam ini.
Jawaban yang Diterima:
Itulah rename
berbasis Perl ditemukan di Debian, Ubuntu dan turunannya, dilihat dari sintaksnya. Anda tidak dapat menggunakan tr
operator karena bekerja pada seluruh string. Tetapi Anda dapat mencocokkan ekstensi, dan huruf kecil dengan L
.
rename 's/.[^.]*$/L$&/' *.JPG *.MOV
Di sini tidak perlu, tetapi jika regexp lebih cocok dari bagian yang ingin Anda kecilkan, Anda dapat menempatkan bagian yang akan dicocokkan dalam grup:
rename 's/.([^.]*)$/.L$1/' *.JPG *.MOV
Ganti *.JPG *.MOV
oleh *.*
untuk bertindak pada semua file terlepas dari ekstensi. Di bash 4.3 (dan juga di bash 4.0–4.2, dengan peringatan bahwa ini juga melintasi tautan simbolis ke direktori), Anda dapat dengan mudah bertindak pada file di subdirektori dan seterusnya secara rekursif:
rename 's/.[^.]*$/L$&/' **/*.*
Untuk penggemar zsh (:r
dan :e
pengubah mengisolasi ekstensi dari sisa file):
autoload zmv
zmv '*.(MOV|JPG)' '${f:r}.${(L)f:e}' # these extensions, current directory
zmv '*.*' '${f:r}.${(L)f:e}' # all extensions, current directory
zmv '**/*.*' '${f:r}.${(L)f:e}' # all extensions, recursive directory traversal