4

У меня есть две директории: dirA, которая содержит N gb данных, и dirB, которая должна содержать только самые новые M gb данных из dirA. Когда файлы добавляются в dirA, они также должны быть добавлены в dirB, тогда как самые старые файлы в dirB должны быть удалены.

Это возможно с rsync? или любое другое программное обеспечение?

1 ответ1

1

Вот попытка. Предостережение: я не тестировал следующий код подробно.

dirA=/path/to/dirA
dirB=/other/path/to/dirB

tmpdir=/path/to/tmpdir

cd "$dirA"
find . -type f -printf '%T@ %s %p\0' | sort -nr -z \
awk 'BEGIN {RS="\000"; ORS="\000"; maxsize=2147483648} 
{size += $2; if (size > maxsize) exit; print $3}' | \
rsync -Rpt --link-dest="$PWD" --files-from=- -0 . "$tmpdir" && \
rsync -rpt --delete "$tmpdir" "$dirB"

Некоторые объяснения:

  • Цель частей find , sort и awk состоит в том, чтобы получить машинно-разборный (т. Е. Разделенный нулями) список новейших файлов, отсортированный сначала по самым новым, а затем обрезать этот список, когда накопленный размер достигает 2 ГиБ (2147483648 просто 2 * 2 ^ 30 байт, или 2 ГиБ (отрегулируйте это число по вкусу).
    Примечание. Сравнение меньше чем в части awk означает, что размер является жесткой верхней границей (условие « максимум »), поэтому это может привести к ситуациям, подобным следующему: если бы самый новый файл был 4 ГиБ, ничего не было бы включено в Синхронизация Переместите print $3 в начало { } чтобы получить противоположное поведение (« по крайней мере »), в этом случае вы получите файл 4 ГиБ и в итоге синхронизируете в два раза больше, чем вы предполагали. Я предположил, что первое было более желательным.
  • Первый rsync извлекает эти файлы во временную папку ("$tmpdir"), но сохраняет путь (-R aka --relative). Поскольку он использует жесткие ссылки (используя --link-dest), а не полную копию, этот шаг занимает незначительное место, но $tmpdir должен находиться в той же файловой системе, что и $dirA .
  • Второй вызов rsync выполняет фактическую синхронизацию с $dirB и --delete -ing старыми файлами в $dirB нет в $tmpdir . Причина использования временного каталога и выполнения этого в два этапа заключается в том, что я еще не нашел способ заставить часть удаления работать за один шаг.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .