将文件名的特定部分从小写重命名为大写

将文件名的特定部分从小写重命名为大写

我有一个目录,其中包含几个文件,名称如下:

London_qle_merged
Paris_qle_merged
Tokyo_qle_merged
London_qle_obs
Paris_qle_merged
Tokyo_qle_merged

如何重命名文件名中包含 *merged 的​​文件,如下所示:

London_Qle_merged
Paris_Qle_merged
Tokyo_Qle_merged

我知道我可以按如下方式进行循环:

for name in Paris London Tokyo do;
  mv ${name}_qle_merged ${name}_Qle_merged
done

但就没有别的办法了吗?

答案1

当然。在 ksh/Bash/zsh 中:

for f in *_merged; do
    mv -- "$f" "${f/_qle_/_Qle_}" 
done

或在标准外壳中。

for f in *_qle_merged; do
    mv -- "$f" "${f%_qle_merged}_Qle_merged" 
done

另请参阅,例如BashGuide 中的参数扩展

答案2

我通过 awk 和 tr 的组合完成了这个

命令

find . -type f -iname "*merged" |tr -d "./" | awk -F "_" '{print "mv" " " $1"_"$2"_"$3 " " $1"_"toupper(substr($2,1,1))substr($2,2)"_"$3 }' | sh

下面是合并的文件

London_qle_merged
Paris_qle_merged
Tokyo_qle_merged 

重命名为

London_Qle_merged
Paris_Qle_merged
Tokyo_Qle_merged

答案3

这将在没有脚本循环的情况下完成工作,只产生一个子进程:

rename 's/qle/Qle/' *_merged

答案4

命令rename是你的朋友。它sed用于文件名。 (确保您有 Larry Wall 版本,至少有两个程序具有此名称)。

以下答案针对文件内容,因此使用sed.我已经使用了它并将其重新用于rename. https://unix.stackexchange.com/a/211579/4778

rename  -e 's/_(.)/_\u$1/' *_merged

它会将紧随第一个 的字母变成大写字母_

针对此特定输入的更简单的解决方案

rename 's/qle/Qle/' *_merged

相关内容