rsync файлы старше 1 недели

24

Я хочу запустить rsync на сервере A, чтобы скопировать все файлы с сервера B, если они старше 7 дней.

find . -mtime -7

Я не хочу удалять файлы на сервере B.

mm1
источник
б) как часто вы запускаете rsync?

Ответы:

30

Это должно дать вам твердый ход

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

Это копирует узлы устройства, разрешения, временные метки. Я почти уверен, что опция -H не будет точной с --files-from

sehe
источник
23
Чтобы установить это как удаленный фильтр: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
Я хочу добавить исправление для комментария кибер-тоста. Возможно, контекст у него отличается от моего, но я пытался просто извлечь файлы с удаленного сервера с учетом временных критериев. Итак, сервер A - это мой пункт назначения, а сервер B - мой источник, а затем: rsync -avn --files-from = <(ssh user @ A 'find / path / on / A / -mtime -7 -type f -exec basename {} \; ') user @ B: / / path / in / server / A Обратите внимание, что есть только ведущий / для источника. --Files-from заботится об относительном пути для вас. Если у вас есть сомнения, используйте man rsync и посмотрите раздел --files-from.
Einarc
@cybertoast Что basenameзначит в вашей команде? Вы можете объяснить, пожалуйста?
Kemat Rochi
@KematRochi - «basename, dirname - возвращать имя файла или часть каталога с именем пути». Надеюсь, это поможет.
Cybertoast
6

Я написал этот сценарий на основе комментария Cybertoast для синхронизации с удаленного сервера на локальный.

Вы можете вызвать сценарий с ./script.sh 3или ./script.sh 3 dryдля пробного запуска.

#!/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:. .
Ромер
источник