Обработка переименованных файлов или каталогов в rsync


26

Я работаю над 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:?

Ответы:


23

Вы можете обрабатывать перемещенные и переименованные файлы, rsyncесли файловые системы в исходном и целевом каталоге поддерживают жесткие ссылки. Идея состоит в том, чтобы позволить rsync восстанавливать жесткие ссылки перед реальной передачей. Вы можете найти блестящее объяснение здесь .

В итоге мы получили простое решение, которое создает скрытое дерево жестких ссылок внутри директории source / target, основной скрипт может выглядеть так:

# 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ссылаетесь, также относится к этой замечательной базовой статье, FWIW. everythinglinux.org/rsync
JakeGould

19

Вы можете посмотреть -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.

7
Обратите внимание, что при использовании --fuzzyвы должны рассмотреть возможность его подключения , так--delete-delay как «rsync по умолчанию делает это --delete-before, удаляя базовый файл, прежде чем его можно будет скопировать / переместить» . Источник: Соня Гамильтон
Ронан Жоше

1

Ты не можешь

Rsync имеет три режима,

  • Скопируйте все файлы
  • Копировать существующие (измененные / неизмененные) файлы - на это у вас есть много вариантов
  • Скопируйте несуществующие файлы.

Однако эти три режима имеют две подкатегории,

  • Исключить на
  • Включить на

Rsync не отслеживает, какие файлы переименованы, у него нет состояния. Вместо этого попробуйте скопировать все файлы и исключить те, которые вам не нужны. У вас не может быть изменяющего белого списка, у вас может быть черный список.

rsync [..stuff..] --exclude 'lib/'

Гоча спасибо за ввод придется жить с переименованными файлами тогда.
Jmituzas

Вы можете удалить файлы, которые не существуют, это прекрасно. Но как функция копирования, если вы переименуете исходный код, он скопирует переименованный файл.
Эван Кэрролл

Я могу сохранить версии с -b и установить суффикс = в date +%Y%m%d%k%M%Sлюбом случае я могу получить суффикс = date +%Y%m%d%k%M%S.ORIGINALSUFFIX?
Jmituzas

0

Насколько я знаю, rsyncне может распознать переименование файлов Новые файлы придется перенести снова. Смотри ответ Артема .

Чтобы удалить пропавшие файлы, обязательно используйте --deleteопцию.

Кроме того, для зеркалирования я бы порекомендовал вам использовать -a( архив ), в котором есть несколько приятных опций.

Посмотрите на man 1 rsyncдетали.


спасибо, что будет работать --delete / mymounts / test1 / / mymounts / test2 /
jmituzas
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.