Как именно rsync решает, что синхронизировать?

15

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

Сценарий: я rsync -av --progress /dir/a /dir/b и делаю свое дело.

Я добавляю новые файлы в / dir / a и снова запускаю ту же команду, он знает, что сделал, и копирует только новые файлы.

Я добавляю новые файлы в / dir / a и переименовываю некоторые файлы в / dir / b, и, возможно, тоже удаляю несколько.

Если я запустлю rsync -av --progress /dir/a /dir/bснова, что будет скопировано? Просто новые файлы, потому что он знает, что он ранее скопировал, или файлы, которые также были переименованы / удалены, потому что их больше нет.

И в качестве бонуса, если ранее скопированные файлы будут скопированы снова, есть способ , чтобы предотвратить это, так что только новые дополнения к / режу / а копируются?

На данный момент я счастлив проверять вещи вручную, но по мере увеличения данных мне потребуется больше автоматизации для выполнения этой задачи.

SPooKYiNeSS
источник
3
-iФлаг очень удобно. Для каждого файла он дает строку соответствия, которую можно декодировать, чтобы понять, почему он совпадает (флаг для времени мода, флаг для размера и т. Д.)
BowlOfRed

Ответы:

17

Я добавляю новые файлы в / dir / a и снова запускаю ту же команду, он знает, что сделал, и копирует только новые файлы.

Нет, он не знает, что делал в предыдущем заезде. Он сравнивает данные на принимающей стороне с данными для отправки. С достаточно маленькими данными это не будет очевидным, но когда у вас достаточно больших каталогов, время, потраченное на сравнение перед началом копирования, легко ощутимо.

Проверка по умолчанию для времени и размера модификации файла. От man rsync:

-c, --checksum
      This changes the way rsync checks if the files have been changed
      and  are in need of a transfer.  Without this option, rsync uses
      a "quick check" that (by default) checks if each file’s size and
      time of last modification match between the sender and receiver.
      This option changes this to compare a 128-bit checksum for  each
      file  that  has a matching size.  Generating the checksums means
      that both sides will expend a lot of disk I/O  reading  all  the
      data  in  the  files  in  the transfer (and this is prior to any
      reading that will be done to transfer changed  files),  so  this
      can slow things down significantly.

И:

-u, --update
      This  forces  rsync  to  skip  any  files  which  exist  on  the
      destination  and  have  a  modified  time that is newer than the
      source  file.   (If  an  existing   destination   file   has   a
      modification time equal to the source file’s, it will be updated
      if the sizes are different.)

Обратите внимание, что это не подразумевается под опциями, которые вы использовали. -aявляется:

-a, --archive               archive mode; same as -rlptgoD (no -H)
-r, --recursive             recurse into directories
-l, --links                 copy symlinks as symlinks
-p, --perms                 preserve permissions
-o, --owner                 preserve owner (super-user only)
-g, --group                 preserve group
    --devices               preserve device files (super-user only)
    --specials              preserve special files
-D                          same as --devices --specials
-t, --times                 preserve times
Мур
источник
Лучшее описание, которое я видел (пока), спасибо
SPooKYiNeSS
2
Небольшое дополнение. Переименованные файлы рассматриваются как уникальные файлы на обоих концах. Указание --fuzzyодин раз распознает их как одинаковые в том же каталоге. Использование в --fuzzyдва раза расширяет эту возможность в других местах. Смотрите man rsyncподробности. Конечно, одной из основных причин использования rsyncявляется его способность копировать только те части файла, которые изменились. Это может значительно ускорить передачу по сети. Кстати, опция контрольной суммы упомянута выше для объяснения того, как rsyncработает. В большинстве случаев его не следует использовать.
Джо
6

Общая

Если я правильно понимаю, rsync -avне имеет памяти, поэтому он будет копировать файлы, которые также были переименованы / удалены, потому что они присутствуют в источнике, но больше не присутствуют в цели.

подсказки

  • Используйте опцию -n«пробный запуск», чтобы проверить, что происходит перед запуском rsyncкомандной строки.

  • Обратите внимание на особое значение косой черты после исходного каталога и увидите разницу между

    rsync -av --progress dir/a/ dir/b
    

    и

    rsync -av --progress dir/a dir/b
    

    который описан в руководстве man rsync.

пример

Ваш особый случай (добавление файла в исходный каталог «a» и удаление файла из целевого каталога «b») добавит как добавленный файл, так и ранее скопированный файл, поскольку он все еще находится в исходном каталоге. Это будет происходить как с опцией, так и без нее, -uи я не знаю никакой опции, rsyncчтобы легко это исправить, если вы хотите сохранить ее в исходном каталоге.

Но вы можете удалить его из исходного каталога или поместить имя файла в файл excludedи использовать опцию --exclude-from=excluded(для многих файлов) или просто --exclude=PATTERNдля одного или нескольких файлов.

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-2

sent 103 bytes  received 25 bytes  256.00 bytes/sec
total size is 13  speedup is 0.10 (DRY RUN)

$ rsync -av --progress dir/a/ dir/b
sending incremental file list
./
file-1
              6 100%    0.00kB/s    0:00:00 (xfr#1, to-chk=1/3)
file-2
              7 100%    6.84kB/s    0:00:00 (xfr#2, to-chk=0/3)

sent 196 bytes  received 57 bytes  506.00 bytes/sec
total size is 13  speedup is 0.05

$ echo textx-3>./dir/a/file-3

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 121 bytes  received 22 bytes  286.00 bytes/sec
total size is 21  speedup is 0.15 (DRY RUN)

$ rm dir/b/file-1 
rm: ta bort normal fil 'dir/b/file-1'? y

$ rsync -avn --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --progress dir/a/ dir/b
sending incremental file list
./
file-1
file-3

sent 124 bytes  received 25 bytes  298.00 bytes/sec
total size is 21  speedup is 0.14 (DRY RUN)

$ rsync -avun --exclude=file-1 --progress dir/a/ dir/b
sending incremental file list
./
file-3

sent 104 bytes  received 22 bytes  252.00 bytes/sec
total size is 15  speedup is 0.12 (DRY RUN)

Альтернатива: unison

Вы можете протестировать инструмент unison, который является инструментом синхронизации . Он предоставляет визуальный метод для выявления особых случаев и решения, что делать. Есть версия GUI ( unison-gtk).

sudodus
источник
Хорошие примеры спасибо. Я действительно знал / в конце, я просто спрашиваю об этом из приложения, и пропустил его (и вы можете ясно видеть, что я только что скопировал / опубликовал
SPooKYiNeSS
И снова он отправляет до того, как я закончил, и не позволяет мне редактировать мой комментарий ... Скопировал / вставил второй. Я посмотрю на необычное и посмотрю, сможет ли он сделать то, что я хочу, а если нет, я вернусь к плану б и просто сделаю сценарий
SPooKYiNeSS
Я использую в unison-gtkтечение нескольких лет, и я счастлив с этим. (Я rsyncтоже использую .)
sudodus
1

Он только копирует новые файлы в / dir / a. Все, что вы делаете в / dir / b, будет игнорироваться, если вы не используете опцию --delete. В этом случае переименованные файлы в / dir / b будут удалены. Это заставит / dir / b стать точно таким же, как / dir / a.

Что касается бонуса, вы имеете в виду как в случае переименования файлов в / dir / a, а затем rsyncing в / dir / b? Я не думаю, что есть способ предотвратить повторное копирование файлов rsync в этом случае.

Герман Ингялдссон
источник
Я не ожидал, что найдется какой-то другой способ, кроме использования атрибута для определения, но тогда, если он будет делать сценарий для детишки, и он больше не понадобится. Спасибо за ваш ответ, хотя, по крайней мере, теперь я знаю, что мне нужно делать.
SPooKYiNeSS