Обробка перейменованих файлів або каталогів у 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 реконструювати жорсткі посилання перед реальною передачею. Ви можете знайти блискуче пояснення тут .

Ми закінчили просте рішення, яке створює приховане дерево жорстких посилань всередині вихідного / цільового каталогу, базовий сценарій може бути таким:

# 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 за замовчуванням робить a --delete-before, тим самим видаляючи базовий файл, перш ніж його можна буде скопіювати / перемістити" . Джерело: Sonia Hamilton
Ronan Jouchet

1

Ви не можете.

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

  • Скопіюйте всі файли
  • Скопіюйте існуючі (модифіковані / не змінені) файли - для цього у вас є багато варіантів
  • Скопіюйте неіснуючі файли.

Однак ці три режими мають дві підкатегорії,

  • Виключіть на
  • Включити на

Rsync не відстежує, які файли перейменовані, у них немає стану. Подумайте замість цього скопіювати всі файли та виключити ті, які вам не потрібні. Ви не можете мати список переключень, ви можете мати чорний список.

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

gotcha спасибі за вхід доведеться жити з перейменованими файлами тоді.
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.