如何旋转类似于 logrotate 的枚举文件名?

如何旋转类似于 logrotate 的枚举文件名?

我有几个文件,比如 map-0.jpg(最新)、map-1.jpg、map-2.jpg、...、map-9.jpg(最旧)。现在我的 cronjob 从互联网上下载了一张新图片,并将其保存为 map-0.jpg。但是,所有其他文件都应该重新枚举(0 -> 1、1 -> 2,依此类推)。在我的例子中,数字 9 可以丢弃。

是否有一个方便的 bash 命令可以像 logrotate 一样枚举我的文件?

感谢帮助!

答案1

您可以使用 logrotate,但有一些限制。

创建一个rotatemap.conf

/path/to/map.jpg {
  rotate 9
}

然后从你的 cronjob 运行 logrotate,如下所示:

logrotate -f -s /path.to/rotatemap.state /path/to/rotatemap.conf

这会将文件重命名map.jpg为,并且如果存在map.jpg.1则会删除旧文件。map.jpg.9

限制:

  • 几乎每条路径都必须硬编码。
  • 旋转文件中的数字始终位于文件名的末尾。至少我发现没有办法改变这一点。

阅读 logrotate () 的详细手册man logrotate来获取更多信息。

答案2

myrotate() {
    # usage: myrotate /path/to/map-0.jpg
    local dest=$1
    local dest_dir=$(dirname "$dest")
    local dest_prefix=$(basename "${dest%-*}")
    local dest_ext=${dest##*.}
    local n

    printf "%s\n" "$dest_dir/${dest_prefix}"-*."$dest_ext" | 
    sort -V -r | 
    while IFS= read -r file; do
        n=${file##*-}
        n=${n%.*}
        echo mv "$file" "$dest_dir/${dest_prefix}-$((n+1)).$dest_ext"
    done
}

如果您对它的工作满意,请将“echo mv”更改为“mv”。


我错过了你只想保留 9 的那部分。这里有一些简洁的 bash:

for i in {8..0}; do mv map-$i.jpg map-$((i+1)).jpg; done
mv $file map-0.jpg

相关内容