Rename

使用“rename”重命名文件以具有小寫副檔名

  • May 19, 2017

我目前正在嘗試重命名大量文件,並且一直在使用非常笨拙的方法來這樣做,例如:

rename 's:(.*)\.MOV:$1.mov:g' *.MOV
rename 's:(.*)\.JPG:$1.jpg:g' *.JPG

我真正想做的是能夠使用‘y’ sedoperator組合所有這些命令。顯然,使用此運算符,您可以將項目轉換為小寫。問題是我只需要轉換副檔名。有沒有辦法使用這個命令來做到這一點?我需要將以下表達式中的擷取組轉換為小寫:^.+\.(.+)$. 有沒有辦法做到這一點?我對這些類型的轉換有點陌生。

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 粉絲:rand: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

引用自:https://unix.stackexchange.com/questions/19807