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"
我试过 mv
和 rename
但没有任何效果。
你可以使用 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
我有一个包含 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"
我试过 mv
和 rename
但没有任何效果。
你可以使用 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