我有一个包含500多个文件的目录,这里有一个文件样本:
random-code_aa.log
随机code_aa_r-13.log
随机code_ab.log
随机code_ae.log
随机code_ag.log
随机code_ag_r-397.log
随机code_ah.log
随机code_ac.log
随机code_ac_r-41.log
随机code_ax.log
随机code_ax_r-273.log
随机code_az.log
我想要做什么,最好使用bash循环,查看*_r-*.log
文件的目录,如果找到,则尝试查看是否存在类似的.log
文件,但没有前面的内容_r-*.log
,如果找到,则将.log文件重命名为相应的_r-*.log
文件,但将r
更改为i
。
使用上面的文件示例中的示例更好地演示:
if "random-code_aa_r-13.log" and "random-code_aa.log" exist then
rename "random-code_aa.log" to "random-code_aa_i-13.log"
我已尝试使用mv
和rename
,但没有任何效果。
答案 0 :(得分:1)
这个简单的BASH脚本应该注意:
for f in *_r-*.log; do
rf="${f/_r-*log/.log}"
[[ -f "$rf" ]] && mv "$rf" "${f/_r-/_i-}"
done
答案 1 :(得分:0)
您可以使用sed:
for file in *_r-*.log ; do
barename=`echo $file | sed 's/_r-.*/.log/'`
newname=`echo $file | sed 's/_r-\(.*\)/_i-\1/'`
if [ -f $barename ] ; then
mv $barename $newname
fi
done
您可以尝试改进正则表达式,因为它对某些文件名不安全。但它应该适用于仅包含减号作为分隔符的文件名。
答案 2 :(得分:0)
您应该能够通过参数替换来实现:
for f in *_r-*.log
do
stem="${f%_r-*.log}
num="${f%.log}"; num="${num##_r-}"
if test -e "${stem}_aa.log"
then mv "${stem}_aa.log" "${stem}_aa-${num}.log"
fi
done