Как rsync только новые файлы

144

Я пытаюсь настроить rsync для синхронизации моего основного веб-сервера с удаленным сервером, добавив недавно сгенерированный файл на более поздний.

Вот команда, которую я использую:

rsync -avh --update -e "ssh -i /path/to/thishost-rsync-key" remoteuser@remotehost:/foo/bar /foo/bar

Но кажется, что веб-сервер фактически передает все файлы, несмотря на флаг --update. Я пробовал разные комбинации флагов (например, опуская «-a» и используя вместо него «-v»), но ни одна не помогла. Так интересно, как я могу изменить команду rsync для отправки только недавно добавленных файлов. Спасибо

супер Марио
источник
2
Если вы хотите синхронизировать файлы с удаленным сервером, разве это не должно быть последним? т.е. rsync /foo/bar remoteuser@remotehost:/foo/bar
острокач
Вас может заинтересовать эта веб-страница . Также будьте осторожны с файловой системой. Если файловая система сервера не поддерживает все, что -aподразумевает эта опция (владелец, группа, привилегии, ...), это должно быть причиной нашей проблемы.
апреля
2
Ни один из ответов не решает проблему, когда локальные файлы не были полностью скопированы в удаленный пункт назначения, и вы хотите только rsync новые файлы.
Аксель Брегнсбо
Я только что нашел -cвариант. Он пропускает существующие файлы на основе контрольной суммы, а не времени изменения или размера.
haheute

Ответы:

181

От man rsync:

--ignore-existing       skip updating files that exist on receiver

--updateделает что-то немного другое, поэтому, вероятно, вы получаете неожиданные результаты (см. man rsync):

Это заставляет rsync пропускать любые файлы, которые существуют в месте назначения и имеют измененное время, которое является более новым, чем исходный файл . (Если существующий конечный файл имеет время модификации, равное времени исходного файла, оно будет обновлено, если размеры будут другими.)

Крис Даун
источник
1
Ну, на самом деле я попробовал команду с «--ignore-существующие» вместо «--update». Это закончилось быстро, но не помещает новые файлы на удаленный хост. Есть идеи? Спасибо
Supermario
13
Справочные страницы отстой (это верно, я пошел туда), в данном случае, --ignore-existingозначает ли это, что не передаются файлы, которые существуют на приемнике, или не передаются файлы, если на приемнике существует какой-либо файл / папка с тем же именем?
Пук
7
--update ли пропускать файлы , когда mtimes идентичны (что не то , что подразумевает формулировку). Я проверял это. Я считаю, что формулировка была бы лучше понята, если бы в ней говорилось, что «будут скопированы только исходные файлы, которые новее, чем место назначения».
Осьминог
4
@Octopus "будут скопированы только исходные файлы, которые новее, чем место назначения" ... или исходные файлы, которые имеют то же время модификации, что и их целевые файлы, но имеют разные размеры . Я думаю, что это важный момент. (Крис уже освещал это, спасибо)
Джонатан Комар
Так что вам нужны --ignore-Существующий и -r (рекурсивный). -v (многословно) тоже приятно иметь :-)
DutchUncle
40

В моем случае у меня были похожие проблемы, когда все файлы передавались вместо только измененных / новых. Я решил это с помощью параметров -t(вместо -a) и -P(эквивалентно --partial --progress):

rsync -h -v -r -P -t исходная цель

Это передает только новые файлы и файлы, уже существующие, но измененные: -aслишком много, как синхронизация идентификатора пользователя и группы, которая в моем случае не может работать, поскольку у меня разные пользователи и группы в исходной и целевой системах.

Параметры подробно:

  • -h: читаемые человеком цифры
  • -v: подробный
  • -r: записаться в каталоги
  • -P: --partial(сохранить частично переданные файлы) +
            --progress(показать прогресс во время передачи)
  • -t: сохранить время модификации
t0r0X
источник
2
+1 для '-a делает слишком много' (действительно -rlptgoD, так что разрешение не расплющивается, группы и владелец сохранены - не мое типичное безопасное для игры резервное копирование ...)
Фрэнк Нок
2

Исходя из моего опыта работы с rsync, копирование раздела размером 1 ТБ слишком велико, чтобы быть эффективным. Для его обработки требуется rsync навсегда. Вместо этого делайте это по подкаталогам. То есть, запустите rsync для каждого главного подкаталога. Это происходит намного быстрее, если не нужно манипулировать десятками тысяч файлов.

тургут калфаоглу
источник
1
Может быть, у вас закончилась память, и ваша система начала обмениваться?
Марсель Буркхард
-2

Пытаться

rsync -zvrt --update SOURCE DESTN
омега
источник
8
Немного больше объяснения к команде выше было бы оценено для OP.
Пешке
с man-страницы `-u, --update пропустить файлы, которые новее на приемнике`
ShoeLace