Rename
使用“rename”重命名文件以具有小寫副檔名
我目前正在嘗試重命名大量文件,並且一直在使用非常笨拙的方法來這樣做,例如:
rename 's:(.*)\.MOV:$1.mov:g' *.MOV rename 's:(.*)\.JPG:$1.jpg:g' *.JPG
我真正想做的是能夠使用‘y’
sed
operator組合所有這些命令。顯然,使用此運算符,您可以將項目轉換為小寫。問題是我只需要轉換副檔名。有沒有辦法使用這個命令來做到這一點?我需要將以下表達式中的擷取組轉換為小寫:^.+\.(.+)$
. 有沒有辦法做到這一點?我對這些類型的轉換有點陌生。
rename
從語法來看,這是在 Debian、Ubuntu 和衍生產品上發現的基於 Perl 的。您不能使用tr
運算符,因為它作用於整個字元串。但是您可以匹配副檔名,並將其小寫為\L
.rename 's/\.[^.]*$/\L$&/' *.JPG *.MOV
這裡沒有必要,但如果正則表達式匹配的多於您想要小寫的部分,您可以將要匹配的部分放在一個組中:
rename 's/\.([^.]*)$/.\L$1/' *.JPG *.MOV
替換
*.JPG *.MOV
為*.*
對所有文件進行操作,無論副檔名如何。在 bash ≥4.3 中(以及在 bash 4.0–4.2 中,需要注意的是這也會遍歷到目錄的符號連結),您可以輕鬆地對子目錄中的文件進行遞歸操作,依此類推:rename 's/\.[^.]*$/\L$&/' **/*.*
對於zsh 粉絲(
:r
and:e
修飾符將副檔名與文件的其餘部分隔離開來):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