将文件扩展名从大写重命名为小写的命令是什么?
例子:
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/
会暗示这些正则表达式操作的变量是$_
。另外,m
当m//
分隔符是斜杠时,我们可以省去。然而,我们确实需要它,以防万一m{}
m||
。这是一种非常常见的Perl
风格习语。