Как копировать каждый день в другое из двух направлений?

Как это сделать с помощью cron?

  • Сегодня: cp * ~/destination.0
  • Завтра: cp * ~/destination.1
  • На следующий день: cp * ~/destination.0
  • На следующий день: cp * ~/destination.1

... и так далее.

Любая помощь будет принята с благодарностью!

7
задан 1 December 2017 в 16:07

4 ответа

Один вкладыш:

0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))

Объяснение:

$(( $(date -d 0:00 +%s)/(3600*24) % 2))
  • вернет отметку времени в секундах (+%s) сегодняшнего дня в 0:00 (-d 0:00) .
  • Разделенное на (3600*24) вернет количество дней от эпохи Unix.
  • %2 вернет 0 или 1 для нечетных или четных дней с начала эпохи Unix.
6
ответ дан 1 December 2017 в 16:07

Ежедневно запускайте этот скрипт из cron:

#! /bin/sh
set -e
cp * ~/destination.0
mv ~/destination.0 ~/destination.last
mv ~/destination.1 ~/destination.0
mv ~/destination.last ~/destination.0
0
ответ дан 1 December 2017 в 16:07

Я соглашаюсь с "выполненный cronjob ежедневно, каталоги переключателя в сценарии" ответы, но я сделал бы это как это:

#!/bin/bash 
# use hidden link
last=$HOME/.last_destination
#
declare -a dirs
dirs[0]="destination.0"
dirs[1]="destination.1"
#
target=
#
# If $last is a link, it points to the last used directory. Otherwise,
# initialize it and use $HOME/destination.0
if [[ -L "$last" ]] ; then
    # get the name of the linked dir
    old="$(stat  --printf="%N" "$last" | cut -d\' -f4)"
    if [[ "$old" == "${dirs[0]}" ]] ; then
        target="${dirs[1]}"
    else
        target="${dirs[0]}"
    fi
else
    # "$last" is not a link - first time initialization
    target="${dirs[0]}"
fi
# now, with $target set, point the $last link at $target, for next time
rm "$last"
ln -s "$target" "$last"
#
# debugging printouts - remove in real life
echo "$target"
ls -l "$last"
2
ответ дан 1 December 2017 в 16:07

Если было бы нормально написать в ~/destination.0 четные даты и ~/destination.1 в нечетные даты, следующая строка crontab должна работать. Резервное копирование начинается в полночь (0 минут, 0 часов, два первых пункта в строке),

0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

См. Эту ссылку для объяснения синтаксиса crontab,

Планирование задач с помощью заданий Cron

Проверьте командную часть строки в окне терминала,

echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"

, и когда она заработает, вы можете заменить cd dir2copy на cd to-the-actual-directory-you-want-to-copy, замените ~ на /home/your-home-directory и удалите два echo слова, чтобы заставить его выполнять реальную работу.

Проверьте снова, а затем измените строку crontab. (Среда в crontab такова, что вам могут понадобиться явные полные пути к программам, каталогам и файлам данных.)


/bin/date '+%d' находит день месяца, а % - оставшаяся операция, которая производит 0 или 1, который добавляется в конце командной строки.

Вы можете предпочесть /bin/date '+%j', который находит день года, например, сегодня, 1 декабря, это день #335.

3
ответ дан 1 December 2017 в 16:07

Другие вопросы по тегам:

Похожие вопросы: