У меня есть два каталога, 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"
), но сохраняет путь (-R
aka--relative
). Поскольку он использует жесткие ссылки (используя--link-dest
), а не полную копию, этот шаг использует незначительное пространство, но$tmpdir
должен находиться в той же файловой системе, что и$dirA
. - Второй
rsync
вызов выполняет фактическую синхронизацию$dirB
и--delete
-ing старых файлов в$dirB
not found in$tmpdir
. Причина использования временного каталога и выполнения этого в два этапа заключается в том, что я пока не нашел способа заставить часть удаления работать всего за один шаг.