前言:
如果您不关心扩展的大小写,只需在 shell 循环中使用 'tr' 实用程序:
for i in *.txt; do mv "$i" "$(echo "$i" | tr '[a-z]' '[A-Z]')"; done
如果您确实关心扩展的大小写,那么您应该知道有不止一种方法可以做到这一点 (TIMTOWTDI)。就个人而言,我认为这里列出的 Perl 解决方案可能是 Linux 下最简单、最灵活的解决方案。如果您有多个文件扩展名,只需指定您希望保持不变的数字。 BASH4 解决方案也是一个很好的解决方案,但您必须愿意多次编写扩展名,或者使用另一个变量来存储它。但是,如果您需要严重的可移植性,那么我建议使用八进制的这个答案中的最后一个解决方案。某些版本的 Linux 还附带了一个名为 rename 的工具,可能也值得一试。它的用法因发行版而异,因此请输入 man rename 了解更多信息。
解决方案:
使用 Perl:
# single extension
perl -e 's/\.[^\.]*$/rename $_, uc($`) . $&/e for @ARGV' *.txt
# multiple extensions
perl -e 's/(?:\.[^\.]*){2}$/rename $_, uc($`) . $&/e for @ARGV' *.tar.gz
使用 BASH4:
# single extension
for i in *.txt; do j="${i%.txt}"; mv "$i" "${j^^}.txt"; done
# multiple extensions
for i in *.tar.gz; do j="${i%.tar.gz}"; mv "$i" "${j^^}.tar.gz"; done
# using a var to store the extension:
e='.tar.gz'; for i in *${e}; do j="${i%${e}}"; mv "$i" "${j^^}${e}"; done
使用 GNU awk:
for i in *.txt; do
mv "$i" $(echo "$i" | awk '{ sub(/.txt$/,""); print toupper($0) ".txt" }');
done
使用 GNU sed:
for i in *.txt; do
mv "$i" $(echo "$i" | sed -r -e 's/.*/\U&/' -e 's/\.TXT$/\u.txt/');
done
使用 BASH3.2:
for i in *.txt; do
stem="${i%.txt}";
for ((j=0; j<"${#stem}"; j++)); do
chr="${stem:$j:1}"
if [[ "$chr" == [a-z] ]]; then
chr=$(printf "%o" "'$chr")
chr=$((chr - 40))
chr=$(printf '\'"$chr")
fi
out+="$chr"
done
mv "$i" "$out.txt"
out=
done