bash循环以匹配和重命名文件名中包含多个变量的多个文件

时间:2015-07-01 14:17:06

标签: bash loops rename

我有一个包含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"

我已尝试使用mvrename,但没有任何效果。

3 个答案:

答案 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