Eu tenho dois diretórios, dirA que contém N gb de dados e dirB que deve conter apenas os mais recentes M gb de dados de dirA. Quando os arquivos são adicionados ao dirA, eles também devem ser adicionados ao dirB, enquanto os arquivos mais antigos do dirB devem ser excluídos.
Isso é possível com o rsync? ou qualquer outro software?
Responder1
Aqui está uma tentativa. Uma palavra de cautela: não testei extensivamente o código a seguir.
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"
Algumas explicações:
- O objetivo das partes
find
,sort
, eawk
é obter uma lista analisável por máquina (ou seja, delimitada por nulos) dos arquivos mais recentes, classificados primeiro pelos mais recentes e, em seguida, truncar essa lista quando o tamanho acumulado atingir 2 GiB (o 2147483648 é simplesmente 2* 2 ^ 30 bytes ou 2 GiB; ajuste esse número a seu gosto).
Observação:omenor quecomparação naawk
parte significa que o tamanho é um limite superior rígido (um "no máximo" condição), portanto, pode resultar em situações como a seguinte: se o arquivo mais recente tivesse 4 GiB, nada seria incluído na sincronização. Mova oprint $3
para o início do{ }
para obter o comportamento oposto ("pelo menos"), nesse caso você obteria o arquivo de 4 GiB e acabaria sincronizando o dobro do pretendido. Presumi que o primeiro fosse mais desejável. - O primeiro
rsync
extrai esses arquivos para um local temporário ("$tmpdir"
), mas preserva o caminho (-R
também conhecido como--relative
). Como usa links físicos (usando--link-dest
) e não uma cópia completa, esta etapa usa espaço insignificante, mas$tmpdir
deve residir no mesmo sistema de arquivos que$dirA
. - A segunda
rsync
invocação faz a sincronização real$dirB
e--delete
a sincronização de arquivos antigos$dirB
não encontrados em$tmpdir
. A razão para usar o diretório temporário e fazer isso em duas etapas é que ainda não encontrei uma maneira de fazer a parte de exclusão funcionar em apenas uma etapa.