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

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

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

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

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

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

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

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

13
задан 30 October 2017 в 06:24

9 ответов

Я добавляю новые файлы в / 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
16
ответ дан 22 May 2018 в 17:00
  • 1
    Лучшее описание Я видел (пока), спасибо – SPooKYiNeSS 29 October 2017 в 18:56
  • 2
    Небольшое дополнение. Переименованные файлы рассматриваются как уникальные файлы с обоих концов. Указание --fuzzy однажды распознает их как одно и то же в одном каталоге. Использование --fuzzy дважды расширяет эту возможность в других местах. Подробнее см. В man rsync. Конечно, одной из основных причин использования rsync является его способность копировать только те части файла, которые изменились. Это может сделать передачи по сети намного быстрее. BTW, опция контрольной суммы упоминается выше для объяснения того, как rsync работает. В большинстве случаев его не следует использовать. – Joe 2 November 2017 в 11:05
Я добавляю новые файлы в / 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
16
ответ дан 18 July 2018 в 04:19
Я добавляю новые файлы в / 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
16
ответ дан 24 July 2018 в 18:03

General

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

Советы

Используйте опцию -n, «dry run», чтобы проверить, что происходит до того, как вы запустите свою командную строку 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).

4
ответ дан 22 May 2018 в 17:00
  • 1
    Хорошие примеры спасибо. Я действительно знал / в конце, я просто спрашиваю об этом из приложения и пропустил его (и вы можете ясно видеть, что я просто скопировал / опубликовал – SPooKYiNeSS 29 October 2017 в 19:03
  • 2
    И снова он отправляет, прежде чем я закончил и не позволяю мне редактировать свой комментарий ... Скопировал / вставил второй. Я посмотрю необычный и посмотрю, может ли он делать то, что я хочу, и если нет, я вернусь к плану b и просто сделаю скрипт – SPooKYiNeSS 29 October 2017 в 19:04
  • 3
    Я несколько лет использую unison-gtk, и я доволен этим. (Я также использую rsync.) – sudodus 29 October 2017 в 19:07

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

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

1
ответ дан 22 May 2018 в 17:00
  • 1
    Я не ожидал, что будет какой-то способ, кроме использования атрибута для определения, но тогда, если вы создадите скрипт для детей и у вас будет больше необходимости. Спасибо за ваш ответ, хотя, по крайней мере, теперь я знаю, что мне нужно делать. – SPooKYiNeSS 29 October 2017 в 18:58

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

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

1
ответ дан 18 July 2018 в 04:19

General

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

Советы

Используйте опцию -n, «dry run», чтобы проверить, что происходит до того, как вы запустите свою командную строку 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).

4
ответ дан 18 July 2018 в 04:19

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

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

1
ответ дан 24 July 2018 в 18:03
  • 1
    Я не ожидал, что будет какой-то способ, кроме использования атрибута для определения, но тогда, если вы создадите скрипт для детей и у вас будет больше необходимости. Спасибо за ваш ответ, хотя, по крайней мере, теперь я знаю, что мне нужно делать. – SPooKYiNeSS 29 October 2017 в 18:58

General

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

Советы

Используйте опцию -n, «dry run», чтобы проверить, что происходит до того, как вы запустите свою командную строку 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).

4
ответ дан 24 July 2018 в 18:03
  • 1
    Хорошие примеры спасибо. Я действительно знал / в конце, я просто спрашиваю об этом из приложения и пропустил его (и вы можете ясно видеть, что я просто скопировал / опубликовал – SPooKYiNeSS 29 October 2017 в 19:03
  • 2
    И снова он отправляет, прежде чем я закончил и не позволяю мне редактировать свой комментарий ... Скопировал / вставил второй. Я посмотрю необычный и посмотрю, может ли он делать то, что я хочу, и если нет, я вернусь к плану b и просто сделаю скрипт – SPooKYiNeSS 29 October 2017 в 19:04
  • 3
    Я несколько лет использую unison-gtk, и я доволен этим. (Я также использую rsync.) – sudodus 29 October 2017 в 19:07

Другие вопросы по тегам:

Похожие вопросы: