批量小写文件扩展名

批量小写文件扩展名

将文件扩展名从大写重命名为小写的命令是什么?

例子:

hello.JPG
hi.JPG

到:

hello.jpg
hi.jpg

答案1

如果您知道正在处理的文件扩展名,则可以对其进行硬编码:

for f in *.JPG
do
  mv "$f" "${f%.JPG}.jpg"
done

对于更一般的情况:

for f in *
do 
  e="${f##*.}"
  b="${f%.*}"
  mv "$f" "${b}.${e,,}"
done

完成繁重工作的地方bash 变量扩展到:

  • 保存扩展名(从文件名前面尽可能多地删除,直到找到句点)
  • 保存文件名的其余部分(至少去掉文件名末尾的句点)
  • 将文件重命名为新文件名,过程,,中扩展名 ( )小写

答案2

只是添加另一个尚未列出的答案:

for f in *.JPG; do mv "$f" "${f//JPG/jpg}"; done

答案3

rename ' -f and /[A-Z][^.]*$/ and s/\.[^.]+$/\L$&/' *

rename ' -f and s/\.[^.]*[A-Z][^.]*$/\L$&/' *

我们需要认识到,在幕后,rename只是Perl代码。可以将其视为:通配符*将名称提供给 a 中的此代码loop,并对每个名称执行以下操作:

  • 测试当前名称(存储在循环容器中$_)是否是常规文件(文件测试操作符-f文件名,当省略文件名时,默认为$_)注意:为了防止rename认为-f我们想要的文件测试是一个选项我们在之前使用一个空格来-f排除这种可能性!
  • 如果文件名没有任何大写字符开头,那么重命名是没有意义的。因此,我们通过以下正则表达式在文件名的扩展名中检查这一事实:/[A-Z][^.]*$/这会查看从文件名末尾看到的连续的非点字符,以断言文件名的扩展名部分中至少存在一个大写字母。可能会出现这样的情况:没有扩展可言。这一事实将在下一步中得到解决,我们.也在文件名中查找文字。
  • 现在我们知道当前文件名是一个常规文件,并且由于至少存在一个大写字母,因此它是重命名的候选文件。正则表达式s/\.[^.]+$/\L$&/通过从文件名末尾查找并向左查找并抓取所有非点[^.]+字符直到看到文字为止来隔离当前文件名中的完整扩展名部分\.。会将\L$&匹配文本中的所有大写字母转为小写字母。
  • s///我添加了第二个版本,我们在一个命令本身中完成检查扩展名大写的所有工作。
  • 特别注意:m//ands///通常通过运算符在附加字符串上运行=~,例如$var =~ m/[A-Z]+/ $filenm =~ s/ABC/DEF/。但如果有问题的变量恰好是 the$_那么我们可以省去 =~ 并简单地写它m/[A-Z]+/ s/ABC/DEF/会暗示这些正则表达式操作的变量是$_。另外,mm//分隔符是斜杠时,我们可以省去。然而,我们确实需要它,以防万一m{} m||。这是一种非常常见的Perl风格习语。

相关内容