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


4

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

是否有一个方便的bash命令枚举我的文件类似于logrotate?

感谢帮助!

Answers:


5

你可以使用logrotate有一些限制。

创建一个rotatemap.conf

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

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

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

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

限制:

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

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


1
谢谢,我想我会这样做。硬编码是可以的,因为我必须在我的cronjob-table(crontab -e)中使用完整路径。旋转的文件将由Apache提供,我可以说服它添加适当的Content-type-header!
安德烈2014年

什么是rotatemap.state
gies0r

0
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

非常感谢您的回答!我通过在我的Bash-cronjob脚本中使用8x mv-commands(mv 1.jpg 0.jpg,mv 2.jpg 1.jpg)来解决这个问题。这非常简单,使用8行代表9个文件(重命名8个文件并丢弃1个文件)。好吧,我以为会有更优雅的方式。但是,我会研究你的剧本; 也许它会激励我在未来,当我有类似的问题:)
André14年

这是9行文件的2行。
格伦杰克曼2014年

嗯,这是一个很好的单/双线,我期待^^
André14年

如果我保留9,10或20个文件并不重要......最有趣的部分是$((i + 1))对我而言。我知道$()是一个子命令。所以(i + 1)将被计算,但为什么不使用“echo”?或者bash足够聪明,知道我想要什么?我想你忘了子命令中的美元符号,不是吗?:)
安德烈

$( ... )并且$(( ... ))是bash中的两个单独语法。前者是命令替代 ; 后者是算术评估
格伦杰克曼2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.