Rsync-Dateien neuer als 1 Woche

24

Ich möchte rsync auf Server A ausführen, um alle Dateien von Server B zu kopieren, wenn sie neuer als 7 Tage sind.

find . -mtime -7

Ich möchte die Dateien auf Server B nicht löschen.

mm1
quelle
b) Wie oft führen Sie rsync aus?

Antworten:

30

Dies sollte Sie auf solide Weise in Gang bringen

rsync -RDa0P \
    --files-from=<(find sourcedir/./ -mtime -7 -print0) \
    . user@B:targetdir/

Dadurch werden Geräteknoten, Berechtigungen und Zeitstempel kopiert. Ich bin mir ziemlich sicher, dass die Option -H bei --files-from nicht korrekt ist

sehe
quelle
23
So legen Sie dies als Remote-Filter fest:rsync -avn --files-from=<(ssh user@A 'find /path/on/A/ -mtime -7 -type f -exec basename {} \;') user@A:/path/on/A/ user@B:targetdir
Cybertoast
Ich möchte eine Korrektur für den Kommentar von Cybertoast hinzufügen. Vielleicht unterscheidet sich der Kontext von meinem, aber ich habe versucht, Dateien anhand der Zeitkriterien einfach von einem Remote-Server zu extrahieren. Also ist Server A mein Ziel und Server B meine Quelle, dann: rsync -avn --files-from = <(SSH-Benutzer @ A 'find / path / on / A / -mtime -7 -type f -exec basename {} \; ') Benutzer @ B: / / Pfad / in / Server / A Hinweis: Es gibt nur ein führendes / für die Quelle. Das --files-from kümmert sich für Sie um den relativen Pfad. Wenn Sie Zweifel haben, verwenden Sie man rsync und lesen Sie den Abschnitt --files-from.
Einarc
@cybertoast Was basenamebedeutet in Ihrem Befehl? Kannst du bitte erklären?
Kemat Rochi
@KematRochi - "basename, dirname - Dateiname oder Verzeichnisanteil des Pfadnamens zurückgeben". Hoffentlich hilft das.
Cybertoast
6

Ich habe dieses Skript basierend auf dem Kommentar von cybertoast geschrieben, mit dem von einem Remote-Server auf lokal synchronisiert werden soll.

Sie können das Skript mit ./script.sh 3oder ./script.sh 3 dryfür einen Probelauf aufrufen .

#!/bin/bash
TIME=$1
DRYRUN=$2

if [[ -z $TIME ]]; then
  echo "Error: no time argument."
  echo "Please enter the number of days to sync."
  exit 1
fi

if [[ $DRYRUN = "dry" ]]; then
  DRYRUNCMD="--dry-run"
  echo "Dry run initiated..."
fi

rsync -avz $DRYRUNCMD --files-from=<(ssh \
    user@remote "find path/to/data/ \
    -mtime -$TIME ! -name *.mkv -type f \
    -exec ls $(basename {}) \;") \
  user@remote:. .
Rohmer
quelle