Wie kopiere ich jeden Tag an ein anderes von zwei Zielen?

7

Wie geht das mit Cron?

  • Heute: cp * ~/destination.0
  • Morgen: cp * ~/destination.1
  • Nächster Tag: cp * ~/destination.0
  • Nächster Tag: cp * ~/destination.1

...und so weiter.

Jede Hilfe wäre sehr dankbar!

Stefan
quelle
Ja, ich werde rsync verwenden, cp war nur für das Beispiel
Stefan

Antworten:

6

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))
  • gibt den Zeitstempel in Sekunden ( +%s) von heute um 0:00 ( -d 0:00) zurück.
  • Geteilt durch (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.
pLumo
quelle
% 2ist einfach eine Modulo-Operation, die 1 zurückgibt, wenn die ihr gegebene Tageszahl ungerade ist, und 0, wenn sie gerade ist.
Videonauth
+1fü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/
31-
@RoVo genau das habe ich wegen der zwei ungeraden Tage 31 und 1 gesucht! Sehr schlau!
Stefan
Wahr. Ich aktualisiere die Antwort.
pLumo
2

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"
Walzer
quelle
2

Wenn es in Ordnung wäre, ~/destination.0an geraden und ~/destination.1an 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 dir2copymit cd to-the-actual-directory-you-want-to-copy, ersetzen Sie ~mit /home/your-home-directoryund entfernen Sie die beiden echoWö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 0oder 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.

Sudodus
quelle
wird nicht zwischen Tag 365 und 1
wechseln.
1
Ja, Sie haben Recht @RoVo. Mir ist aufgefallen, dass Sie das behoben haben, und ich werde Ihre Antwort positiv bewerten :-) Sie haben mehr Mühe als ich aufgewendet, damit die Dinge genau gemäß der Spezifikation in der Frage funktionieren. Zu Neujahr wäre es für mich in Ordnung, dass der Wechsel übersprungen würde. Mein Computer könnte sowieso ausgeschaltet sein ;-)
Sudodus
Stimmt, aber ich habe mit dem gleichen Problem angefangen ... +%w: Fick die Woche hat eine ungerade Anzahl von Tagen ... dann +%d, dann +%j... dann ... Scheiße, ich werde gefickt ...
pLumo
Wie auch immer, nach einem Schaltjahr +%jwird das neue Jahr korrekt funktionieren ^^
pLumo
nicht wenn das Schaltjahr ist %100: P
derHugo
0

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
Luc Moreau
quelle
Sie schreiben nie etwas an ~/destination.1...
derHugo
Richtig, es gibt einen Fehler in meinem (nicht getesteten) Skript, die letzte Zeile sollte * .last in * .1 anstelle von * .0 umbenennen ... und in der Zwischenzeit habe ich bessere Lösungen mit Modulo 2-Berechnungen gesehen
Luc Moreau
Sogar als Sie jeden Tag kopieren destination.1und destination.0als Backup haben würden .. aber tatsächlich nicht zwischen zwei Zielen wechseln.
derHugo