3

У меня есть несколько файлов, скажем, map-0.jpg (самая новая), map-1.jpg, map-2.jpg, ..., map-9.jpg (самая старая). Теперь мой cronjob загружает новую картинку из интернета и должен сохранить ее как map-0.jpg. Все остальные файлы, однако, должны быть заново перечислены (0 -> 1, 1 -> 2 и т.д.). Номер 9, в моем случае, можно отбросить.

Есть ли удобная команда bash, которая перечисляет мои файлы, похожие на logrotate?

Спасибо за помощь!

2 ответа2

5

Вы можете использовать logrotate с некоторыми ограничениями.

создать rotatemap.conf:

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

затем запустите logrotate из вашего cronjob следующим образом:

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

это переименует файл map.jpg в map.jpg.1 и удалит старый map.jpg.9 если он существует.

ограничения:

  • почти каждый путь должен быть жестко закодирован.
  • число в повернутых файлах всегда находится в конце имени файла. по крайней мере, я не нашел способа изменить это.

Прочитайте подробное руководство по logrotate (man logrotate) для получения дополнительной информации.

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. Вот краткий удар:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .