Назад | Перейти на главную страницу

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

Я работаю над 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 для подробностей.