rsync apenas o N gb de arquivos mais recente

rsync apenas o N gb de arquivos mais recente

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, e awké 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 na awkparte 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 o print $3para 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 rsyncextrai esses arquivos para um local temporário ( "$tmpdir"), mas preserva o caminho ( -Rtambé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 $tmpdirdeve residir no mesmo sistema de arquivos que $dirA.
  • A segunda rsyncinvocação faz a sincronização real $dirBe --deletea sincronização de arquivos antigos $dirBnã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.

informação relacionada