首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在bash中迭代重命名多个文件创建单个文件

在bash中迭代重命名多个文件创建单个文件
EN

Stack Overflow用户
提问于 2021-11-13 19:32:40
回答 3查看 47关注 0票数 0

我的脚本目录中有以下文件:

代码语言:javascript
复制
backup-001.bak backup-002.bak...backup-007.bak

我尝试在纯bash中对它们进行重命名,以便获得:

代码语言:javascript
复制
backup-002.bak backup-003.bak...backup-008.bak

我把以下简单的脚本放在一起,它应该迭代地重命名上述文件;但是,在我运行它之后,我最终只得到了一个文件backup-008.bak。我在这里做错了什么?

代码语言:javascript
复制
i=2
for file in backup-00[0-7].bak; do
    newname="backup-00$((i)).bak"
    mv -- "$file" "$newname"
  ((++i))
done
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-11-13 19:42:38

您正在将backup-000.bak重命名为backup-001.bak。然后将backup-001.bak重命名为backup-002.bak。这将重命名您在上一次迭代中创建的文件。依此类推,遍历所有文件,因此最终将backup-000.bak重命名为backup-008.bak

您应该以相反的顺序处理这些文件:

代码语言:javascript
复制
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可以自动完成这个任务。

票数 1
EN

Stack Overflow用户

发布于 2021-11-13 19:41:24

代码语言:javascript
复制
for i in {7..1}; do
    mv "backup-00$i.bak" "backup-00$((i+1)).bak" ||
    break
done

只适用于0-9 (或100-200等)- bash算法不会返回零填充数字。

票数 2
EN

Stack Overflow用户

发布于 2021-11-13 20:52:18

考虑到最小索引为1,最大索引为7;这里是一个POSIX-shell友好的实现,它正确地处理了备份卷,并忽略了不存在的备份文件。

代码语言:javascript
复制
#!/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
done
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69957588

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档