我有几个文件,比如 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