Como rodar nomes de arquivos enumerados parecidos com logrotate?

2

Eu tenho alguns arquivos, digamos, map-0.jpg (mais novo), map-1.jpg, map-2.jpg, ..., mapa-9.jpg (mais antigo). Agora meu cronjob faz o download de uma nova imagem da internet e deve salvá-la como map-0.jpg. Todos os outros arquivos, no entanto, devem ser recém-enumerados (0 - > 1, 1 - > 2 e assim por diante). O número 9, no meu caso, pode ser descartado.

Existe um comando bash útil que enumera meus arquivos como o logrotate?

Obrigado pela ajuda!

    
por André 24.04.2014 / 19:58

2 respostas

4

você pode usar o logrotate com algumas restrições.

crie um rotatemap.conf :

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

execute o logrotate do seu cronjob assim:

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

isso renomeará o arquivo map.jpg para map.jpg.1 e excluirá o antigo map.jpg.9 se ele existir.

as restrições:

  • praticamente todos os caminhos precisam ser codificados.
  • o número nos arquivos girados está sempre no final do nome do arquivo. pelo menos eu não encontrei nenhuma maneira de mudar isso.

leia o bom manual do logrotate ( man logrotate ) para mais informações.

    
por 24.04.2014 / 21:59
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
}

Altere "echo mv" para "mv" se estiver satisfeito de que está funcionando.

Eu perdi o pouco onde você só quer manter 9. Aqui está um pouco de bash terse:

for i in {8..0}; do mv map-$i.jpg map-$((i+1)).jpg; done
mv $file map-0.jpg
    
por 24.04.2014 / 21:27