Параметр rsync --link-dest не связывается из-за времени файла

Параметр rsync --link-dest не связывается из-за времени файла

Рассмотрим следующий тестовый пример:

mkdir a
echo 'blah' > a/test
mkdir b
echo 'blah' > b/test

rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

Как и ожидалось, rsync создает c/testжесткую ссылку b/test(обратите внимание на количество ссылок 2):

# ls -l c/test
-rw-r--r-- 2 root root 16 Jan  6 19:43 test

А теперь посмотрите на это:

rm -r c # start over
touch b/test
rsync -r --link-dest=/tmp/b /tmp/a/ /tmp/c

Жесткая ссылка не создается:

# ls -l c/test
-rw-r--r-- 1 root root 16 Jan  6 19:50 test

Theстраницы руководстваговорит (выделено мной):

Файлы должны быть идентичны во всехсохранилисьатрибуты (например, разрешения, возможно, право собственности) для того, чтобы файлы были связаны между собой.

Однако я думаю, что по умолчанию время файла несохранилисьи поэтому не должно иметь здесь никакого значения.

Что происходит? Это ошибка? Что я могу сделать?

Моя цель — сэкономить место на сервере непрерывной интеграции, на котором размещено множество ветвей репозитория, путем жесткой привязки всех идентичных файлов. Поэтому моя фактическая команда:
rsync -r --link-dest=/ci/master /ci-runner/build/ /ci/branch-123.
Это означает, что мне не важно время, поэтому я думал о том, чтобы touchпривести их все к текущему времени до , rsyncно это было бы каким-то грубым решением, и, кроме того, touch, похоже, не работает рекурсивно.

решение1

Вы видите результаты алгоритма "быстрой проверки" rsync, который принимает решение о передаче файлов на основе их размера и временной метки. Подробности см. в man rsync:

Rsync находит файлы, которые необходимо перенести, используя алгоритм "быстрой проверки" (по умолчанию), который ищет файлы, которые изменились по размеру или по времени последнего изменения. Любые изменения в других сохраненных атрибутах (по запросу параметров) производятся непосредственно в файле назначения, когда быстрая проверка показывает, что данные файла не нуждаются в обновлении.

У вас есть выбор:

  • Если вы хотите, чтобы временная метка игнорировалась и файлы передавались только на основе измененного размера, вы можете использовать эту --size-onlyопцию.

    Обратите внимание, что это означает, что rsyncизмененный файл не будет передан, если изменение случайно оставило файл того же размера.

  • Если вы хотите rsyncвместо этого проверить, действительно ли содержимое файлов идентично, используйте --checksum. Это может привести к существенному замедлению.

Алгоритм «быстрой проверки» используется по умолчанию, поскольку он представляет собой хороший компромисс между скоростью и точностью.

Связанный контент