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

bash loop to match and rename multiple files with multiple variables within the filenames

我有一个包含 500 多个文件的目录,以下是文件示例:

random-code_aa.log

random-code_aa_r-13.log

random-code_ab.log

random-code_ae.log

random-code_ag.log

random-code_ag_r-397.log

random-code_ah.log

random-code_ac.log

random-code_ac_r-41.log

random-code_ax.log

random-code_ax_r-273.log

random-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 但没有任何效果。

你可以使用 sed:

for file in *_r-*.log ; do
    barename=`echo $file | sed 's/_r-.*/.log/'`
    newname=`echo $file | sed 's/_r-\(.*\)/_i-/'`

    if [ -f $barename ] ; then
        mv $barename $newname
    fi
done

您可以尝试改进正则表达式,因为它对某些文件名不安全。但它应该适用于仅包含减号作为分隔符的文件名。

您应该可以通过参数替换来做到这一点:

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

这个简单的 BASH 脚本应该可以解决这个问题:

for f in *_r-*.log; do
   rf="${f/_r-*log/.log}"
   [[ -f "$rf" ]] && mv "$rf" "${f/_r-/_i-}"
done