
Рассмотрим следующий тестовый пример:
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
. Это может привести к существенному замедлению.
Алгоритм «быстрой проверки» используется по умолчанию, поскольку он представляет собой хороший компромисс между скоростью и точностью.