我有一个目录,其中包含几个文件,名称如下:
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