我的脚本目录中有以下文件:
backup-001.bak backup-002.bak...backup-007.bak我尝试在纯bash中对它们进行重命名,以便获得:
backup-002.bak backup-003.bak...backup-008.bak我把以下简单的脚本放在一起,它应该迭代地重命名上述文件;但是,在我运行它之后,我最终只得到了一个文件backup-008.bak。我在这里做错了什么?
i=2
for file in backup-00[0-7].bak; do
newname="backup-00$((i)).bak"
mv -- "$file" "$newname"
((++i))
done发布于 2021-11-13 19:42:38
您正在将backup-000.bak重命名为backup-001.bak。然后将backup-001.bak重命名为backup-002.bak。这将重命名您在上一次迭代中创建的文件。依此类推,遍历所有文件,因此最终将backup-000.bak重命名为backup-008.bak。
您应该以相反的顺序处理这些文件:
for ((i = 7; i >= 1; i--)); do
oldname="backup-00$i.bak"
newname="backup-00$((i+1)).bak"
if [ -f "$oldname" ]
then
mv -- "$oldname" "$newname"
fi
done顺便说一句,Linux有一个程序logrotate可以自动完成这个任务。
发布于 2021-11-13 19:41:24
for i in {7..1}; do
mv "backup-00$i.bak" "backup-00$((i+1)).bak" ||
break
done只适用于0-9 (或100-200等)- bash算法不会返回零填充数字。
发布于 2021-11-13 20:52:18
考虑到最小索引为1,最大索引为7;这里是一个POSIX-shell友好的实现,它正确地处理了备份卷,并忽略了不存在的备份文件。
#!/usr/bin/env sh
i=7
newname=$(printf 'backup-%03d.bak' $i)
while [ $i -gt 1 ]; do
i=$((i - 1))
oldname=$(printf 'backup-%03d.bak' $i)
echo mv -f -- "$oldname" "$newname" 2>/dev/null || :
newname=$oldname
donehttps://stackoverflow.com/questions/69957588
复制相似问题