Я нахожу несколько ответов на вопрос, так требуемый для выяснения у людей, которые на самом деле используют его, вместо того, чтобы просто хотеть сделать самый большой блог путем заполнения со случайной полу бесполезной информацией.
Сценарий: я rsync -av --progress /dir/a /dir/b
и это делает свою вещь.
Я добавляю новые файлы к/dir/a и выполняю ту же команду снова, это знает то, что это сделало и только копирует новые файлы.
Я добавляю новые файлы к/dir/a и переименовываю некоторые файлы в/dir/b и возможно удаляю некоторых также.
Если я работаю rsync -av --progress /dir/a /dir/b
снова, что будет скопировано? Просто новые файлы, потому что это знает то, что это ранее скопировало, или файлы, которые были переименованы/удалены также, потому что они больше не присутствуют.
И в качестве награды, если ранее скопированные файлы копируются снова, там способ предотвратить это, так, чтобы только новые дополнения к/dir/a были скопированы?
В данный момент я - счастливые вещи проверки вручную, но поскольку данные становятся больше, я испытываю необходимость в большем количестве автоматизации для выполнения этой задачи.
Я добавляю новые файлы к/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
Если я правильно понимаю, rsync -av
не имеет памяти, поэтому он будет копировать файлы, которые также были переименованы / удалены, поскольку они присутствуют в источнике, но больше не присутствуют в цели.
Используйте опцию -n
, «пробный запуск», чтобы проверить, что происходит перед запуском командной строки rsync
.
Обратите внимание на особое значение косой черты после исходного каталога и просмотрите разницу между
rsync -av --progress dir/a/ dir/b
и
rsync -av --progress dir/a dir/b
, которая описана в руководстве [ 116].
[+1121] Ваш особый случай (добавление файла в исходный каталог «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
, который является синхронизирующим инструментом . Он предоставляет визуальный метод для выявления особых случаев и решения, что делать. Существует версия с графическим интерфейсом ( unison-gtk
).
Это только копирует новые файлы в/dir/a. Независимо от того, что Вы выполняете,/dir/b будет проигнорирован, если Вы не будете использовать - удаляют опцию. В этом случае переименованные файлы в/dir/b будут удалены. Это вынудит/dir/b стать точно как/dir/a.
О премии Вы имеете в виду как в случае переименования файлов в/dir/a, и затем rsyncing к/dir/b? Я не думаю, что существует способ предотвратить rsync от просто копирования файлов снова в этом случае.