将文件名从小写重命名为大写

将文件名从小写重命名为大写

我有大约 2k 个文件,目前都是小写的,例如:

file_one.cfr
file_two.cfr
....

我正在寻找一种快速的方法将它们重命名为大写,以便它们就像;

FILE_ONE.cfr
FILE_TWO.cfr
....

如果我从我的 shell 中使用;

for i in *; do mv $i `echo $i | tr [:lower:] [:upper:]`; done

我可以将所有文件和文件扩展名转换为大写。

但是扩展名应该保持小写,所以我的方法不起作用。

欢迎任何编程语言。

答案1

您可以随时使用免费批量重命名实用程序

答案2

在任何 shell 中:

for i in *.cfr 
do 
    mv "$i" "$(echo ${i%.cfr} | tr [:lower:] [:upper:]).cfr"; 
done

它基于您提出的解决方案,但使用参数扩展${parameter%word}从文件名中去除扩展名。

答案3

您的系统上可能已经有一个名为rename或 的Perl 脚本prename

rename 's/([^.]*)/\U$1/' *.cfr

或者这里有一个 Vlad 脚本的版本,它消除了对grepand的需要sed(它可以在版本 4 之前的 Bash 版本中工作,因为它使用tr而不是^^运算符):

#!/bin/bash

for f in *.cfr
do
    if [[ "$f" == "${f//.}" ]]; then continue; fi
    name="${f%.*}"
    ext="${f##*.}"
    newfullname="$(<<< "$name" tr [:lower:] [:upper:])$ext"
    [[ "$f" == "$newfullname" ]] || mv "$f" "$newfullname"
done

答案4

#!/bin/bash

for f in *
do
    <<< $f grep -q "\." || continue
    name=$(<<<$f sed 's/\.[^\.]*$//')
    ext=$(<<< $f sed 's/^.*\(\.[^\.]*\)$/\1/')
    newfullname=$(<<< $name tr [:lower:] [:upper:])$ext
    [ "$f" == "$newfullname" ] || mv "$f" "$newfullname"
done

相关内容