Как это сделать с помощью cron?
cp * ~/destination.0
cp * ~/destination.1
cp * ~/destination.0
cp * ~/destination.1
... и так далее.
Любая помощь будет принята с благодарностью!
Один вкладыш:
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. Ежедневно запускайте этот скрипт из cron:
#! /bin/sh set -e cp * ~/destination.0 mv ~/destination.0 ~/destination.last mv ~/destination.1 ~/destination.0 mv ~/destination.last ~/destination.0
Я соглашаюсь с "выполненный 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"
Если было бы нормально написать в ~/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
.