Antworten:
Einzeiler:
0 0 * * * cp /path/to/* /path/to/destination.$(( $(date -d $(date +%F) +%s)/(3600*24) % 2))
Erläuterung:
$(( $(date -d 0:00 +%s)/(3600*24) % 2))
+%s
) von heute um 0:00 ( -d 0:00
) zurück.(3600*24)
wird die Anzahl der Tage aus der Unix-Epoche zurückgegeben.%2
gibt 0 oder 1 für ungerade oder gerade Tage seit Beginn der Unix-Epoche zurück.% 2
ist einfach eine Modulo-Operation, die 1 zurückgibt, wenn die ihr gegebene Tageszahl ungerade ist, und 0, wenn sie gerade ist.
+1
für die Lösung mit der seconds since 1970-01-01 00:00:00 UTC
Option. Auf diese Weise müssen Sie nicht über das 30/
Ich stimme den Antworten "Täglich den Cronjob ausführen, Verzeichnisse im Skript wechseln" zu, aber ich würde es so machen:
#!/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"
Wenn es in Ordnung wäre, ~/destination.0
an geraden und ~/destination.1
an ungeraden Daten zu schreiben , sollte die folgende Crontab-Zeile funktionieren. Die Sicherung wird um Mitternacht gestartet (0 Minuten, 0 Stunden, die beiden ersten Elemente in der Zeile).
0 0 * * * echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"
Unter diesem Link finden Sie eine Erläuterung der Crontab-Syntax.
Planen von Aufgaben mit Cron-Jobs
Testen Sie den Befehlsteil der Zeile in einem Terminalfenster.
echo cd dir2copy;dtmp=$(( $(/bin/date '+%d') % 2 ));echo /bin/cp * ~/destination."$dtmp"
und wenn es funktioniert, können Sie ersetzen cd dir2copy
mit cd to-the-actual-directory-you-want-to-copy
, ersetzen Sie ~
mit /home/your-home-directory
und entfernen Sie die beiden echo
Wörter , um es den richtigen Job zu machen tun.
Testen Sie es erneut und ändern Sie dann die Crontab-Linie. (Die Umgebung in crontab ist so, dass Sie möglicherweise explizite vollständige Pfade zu Programmen, Verzeichnissen und Datendateien benötigen.)
/bin/date '+%d'
Findet den Tag des Monats und %
ist die verbleibende Operation, die ein 0
oder erzeugt 1
, das am Ende der Befehlszeile angehängt wird.
Vielleicht bevorzugen Sie /bin/date '+%j'
, dass der Tag des Jahres, zum Beispiel heute, der 1. Dezember, der Tag ist #335
.
+%w
: Fick die Woche hat eine ungerade Anzahl von Tagen ... dann +%d
, dann +%j
... dann ... Scheiße, ich werde gefickt ...
+%j
wird das neue Jahr korrekt funktionieren ^^
%100
: P
Führen Sie dieses Skript täglich von cron aus:
#! / bin / sh setze -e cp * ~ / destination.0 mv ~ / destination.0 ~ / destination.last mv ~ / destination.1 ~ / destination.0 mv ~ / destination.last ~ / destination.0
~/destination.1
...
destination.1
und destination.0
als Backup haben würden .. aber tatsächlich nicht zwischen zwei Zielen wechseln.