Вопрос или проблема
У меня относительно большая директория с данными. Она обновляется время от времени, но обычно только небольшая часть дерева меняется. В настоящее время я обновляю её, используя cp -Rl previous_version/ new_version/
, чтобы рекурсивно создать жесткие ссылки в new_version/
, затем я вхожу в new_version
и вручную обновляю файлы, которые изменились. Это очень эффективно с точки зрения занятых ресурсов, но утомительно, и я должен быть осторожным, чтобы заменить обновленные файлы новыми инодами. Если я случайно изменю файлы, это изменит предыдущие версии.
Что мне действительно хотелось бы, так это возможность создать новую директорию updates/
, которая будет содержать только обновленные версии тех файлов, которые изменились, а затем иметь гипотетический инструмент, который я могу запустить вот так:
some-tool previous_version/ updates/ new_version/
Что some-tool
должен делать, так это создать new_version/
с использованием жестких ссылок из previous_version/
, а затем для каждого файла в updates/
он заменит существующий файл в new_version/
на жесткую ссылку из updates/
.
Это позволит мне более легко и безопасно выполнять то, что я делаю, а также обеспечит аккуратные каталоги обновлений, которые четко показывают, что изменилось между каждой версией.
Существует ли что-то подобное, или есть, возможно, другой способ решить мою проблему?
Решение этой проблемы так очевидно, что мне немного стыдно оставлять этот вопрос:
cp -Rl previous_version new_version
cp -Rlf updates/* new_version
Несколько старая тема, но интересный вопрос. Вы рассматривали возможность использования ZFS с дедупликацией? В теории это должно делать магию прозрачно для пользователя. Кроме того, вы можете добавить сжатие lz4 с уровнем 3. Эта комбинация должна сделать размер хранилища еще меньше и быстрее. Единственный минус — это большое количество необходимой оперативной памяти.
Ответ или решение
Для решения вашей задачи по управлению версиями больших директорий с использованием жестких ссылок, существует несколько подходов, которые могут облегчить процесс обновления файлов и минимизировать риск случайного изменения старых версий.
Первый подход, который вы уже упомянули, включает использование команд cp -Rl
и cp -Rlf
. Это простой и эффективный способ работы с версиями файлов:
cp -Rl previous_version/ new_version/
cp -Rlf updates/* new_version/
- Первая команда создает новую директорию
new_version/
, где все файлы берутся как жесткие ссылки изprevious_version/
, что позволяет экономить дисковое пространство. - Вторая команда заменяет только измененные файлы в
new_version/
на жесткие ссылки из директорииupdates/
. Параметр-l
(или--link
) используется для создания жестких ссылок, и-f
(или--force
) позволяет перезаписать существующие файлы.
Дополнительно к этому, вы можете рассмотреть более продвинутые файловые системы, такие как ZFS или Btrfs. Эти файловые системы поддерживают создание снимков и дедупликацию, что может автоматизировать процесс управления версиями и значительно сэкономить дисковое пространство.
Преимущества использования ZFS:
- Дедупликация: ZFS может автоматически удалять дубликаты данных, что позволяет экономить место на диске, даже если у вас много версий одних и тех же файлов.
- Снимки: Вы можете легко создавать снимки (snapshots) на уровне файловой системы, что позволяет вам быстро возвращаться к предыдущим версиям.
- Компрессия: Включение сжатия (например, lz4) позволит еще уменьшить потребление дискового пространства и повысить скорость.
- Требования к памяти: Учтите, что использование таких функций, как дедупликация, может потребовать значительного объема оперативной памяти.
Пример использования ZFS:
-
Создайте пул ZFS:
zpool create mypool /dev/sdX
-
Создайте файловую систему:
zfs create mypool/mydata
-
Активация дедупликации и компрессии:
zfs set dedup=on mypool/mydata zfs set compression=lz4 mypool/mydata
-
Создание снимков:
zfs snapshot mypool/mydata@current_version
- Для обновления просто добавьте файлы в
mypool/mydata
, и изменения будут автоматически отслеживаться.
Такой подход значительно упростит процесс управления версиями и сделает его более безопасным.
В заключение, использование комбинации команд cp
и более современных файловых систем, таких как ZFS или Btrfs, может значительно облегчить работу с версионностью больших директорий.