使用“重命名”将文件重命名为小写扩展名

Naf*_*Kay 5 perl regular-expression rename

我目前正在尝试重命名大量文件,并且一直在使用非常笨拙的方法来这样做,例如:

rename 's:(.*)\.MOV:$1.mov:g' *.MOV
rename 's:(.*)\.JPG:$1.jpg:g' *.JPG
Run Code Online (Sandbox Code Playgroud)

我真正想做的是能够使用'y'sed运算符组合所有这些命令。显然,使用此运算符,您可以将项目转换为小写。问题是我只需要转换扩展名。有没有办法使用这个命令来做到这一点?我需要基本上改造捕获组在下面的表达式为小写:^.+\.(.+)$。有没有办法做到这一点?我对这些类型的转换有点陌生。

Gil*_*il' 9

根据rename语法判断,这是在 Debian、Ubuntu 和衍生产品上发现的基于 Perl 的版本。您不能使用tr运算符,因为它作用于整个字符串。但是你可以匹配的扩展,IT和小写it\L

rename 's/\.[^.]*$/\L$&/' *.JPG *.MOV
Run Code Online (Sandbox Code Playgroud)

这里没有必要,但如果正则表达式匹配的部分多于您想要小写的部分,您可以将要匹配的部分放在一个组中

rename 's/\.([^.]*)$/.\L$1/' *.JPG *.MOV
Run Code Online (Sandbox Code Playgroud)

更换*.JPG *.MOV*.*在所有文件上执行任何扩展的。在 bash ?4.3(以及 bash 4.0-4.2 中,需要注意的是,这也会遍历到目录的符号链接),您可以轻松地对子目录中的文件进行操作,以此类推:

rename 's/\.[^.]*$/\L$&/' **/*.*
Run Code Online (Sandbox Code Playgroud)

对于zsh 粉丝:r: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
Run Code Online (Sandbox Code Playgroud)