rsync только самые новые N ГБ файлов

rsync только самые новые N ГБ файлов

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

Возможно ли это с помощью rsync или какой-либо другой программы?

решение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 ГиБ; измените это число по вкусу).
    Примечание: the меньше, чемсравнение в awkчасти означает, что размер имеет жесткую верхнюю границу ("в большинстве" условие), поэтому это может привести к таким ситуациям: если размер самого нового файла составляет 4 ГиБ, в синхронизацию ничего не будет включено. Переместите print $3в начало , { }чтобы получить противоположное поведение ("по меньшей мере"), в этом случае вы получите файл размером 4 ГиБ и в итоге синхронизируете вдвое больше, чем планировали. Я предположил, что первый вариант более предпочтителен.
  • Первый rsyncизвлекает эти файлы во временное местоположение ( "$tmpdir"), но сохраняет путь ( -Raka --relative). Поскольку он использует жесткие ссылки (используя --link-dest), а не полную копию, этот шаг использует незначительное пространство, но $tmpdirдолжен находиться в той же файловой системе, что и $dirA.
  • Второй rsyncвызов выполняет фактическую синхронизацию $dirBи --delete-ing старых файлов в $dirBnot found in $tmpdir. Причина использования временного каталога и выполнения этого в два этапа заключается в том, что я пока не нашел способа заставить часть удаления работать всего за один шаг.

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