Я работаю над rsync
скрипт для репликации каталога. Он синхронизирует только новые и измененные файлы или каталоги, но мне не нравится тот факт, что он копирует переименованные файлы или каталоги как новый файл или каталог, сохраняя файлы не синхронизированными. Я также установил ограничение пропускной способности в 1 МБ, поскольку оно будет работать в рабочее время. Вот мой сценарий:
rsync -zvru --bwlimit=1024 /mymounts/test1/ /mymounts/test2
Как я могу синхронизировать файлы и каталоги, если кто-то что-то переименовывает, при этом копируя только новые или измененные файлы? Вот рассматриваемые файлы
ls "/mymounts/test1/some stuff"
new directory newfile1.txt newfile3.txt renamedFile.txt
ls "/mymounts/test2/some stuff"
new directory newfile1.txt newfile2.txt newfile3.txt renamedFile.txt
Или есть способ даже переместить переименованные файлы в другой каталог, например: /mymounts/VerControl
?
Вы можете посмотреть на -y | --fuzzy
параметр rsync. Помимо этого, rsync не имеет возможности отслеживать переименования, поэтому вы в конечном итоге переместите переименованный файл.
Из справочной страницы rsync:
-y, --fuzzy
This option tells rsync that it should look for a basis file for
any destination file that is missing. The current algorithm
looks in the same directory as the destination file for either a
file that has an identical size and modified-time, or a simi-
larly-named file. If found, rsync uses the fuzzy basis file to
try to speed up the transfer.
Вы можете обрабатывать перемещенные и переименованные файлы с помощью rsync
если файловые системы в исходном и целевом каталогах поддерживают жесткие ссылки. Идея состоит в том, чтобы позволить rsync восстанавливать жесткие ссылки перед реальной передачей. Ты можешь найти блестящее объяснение здесь.
В итоге мы пришли к простому решению, которое создает скрытое дерево жестких ссылок внутри исходного / целевого каталога, основной сценарий может быть таким:
# Name of hidden directory
Shadow=".rsync_shadow"
# do real sync
rsync -ahHv --stats --no-inc-recursive --delete --delete-after "$Source"/ "$Target"
# update/create hidden dir of hard links in source
rsync -a --delete --link-dest="$Source" --exclude="/$Shadow" "$Source"/ "$Source/$Shadow"
# update/create hidden dir of hard links in target
rsync -a --delete --link-dest="$Target" --exclude="/$Shadow" "$Target"/ "$Target/$Shadow"
у меня есть пример скрипта на GitHub. Но я советую вам провести большое количество тестов, прежде чем использовать этот метод на производстве.
Rsync имеет три режима,
Однако эти три режима имеют две подкатегории:
Rsync не отслеживает, какие файлы были переименованы, у него нет состояния. Вместо этого рассмотрите возможность копирования все файлы и исключая те, которые вы не хотеть. У вас не может быть «белого» списка, вы можете иметь черный список.
rsync [..stuff..] --exclude 'lib/'
Насколько я знаю, Видеть Артёмответ.rsync
не может распознать переименование файлов. Новые файлы придется перенести заново.
Чтобы удалить пропавшие файлы, обязательно используйте --delete
вариант.
Также для зеркалирования я бы порекомендовал вам использовать -a
(архив), который является псевдонимом некоторых хороших опций.
Взгляните на man 1 rsync
для подробностей.