rsync solo los N GB más nuevos de archivos

rsync solo los N GB más nuevos de archivos

Tengo dos directorios, dirA que contiene N gb de datos y dirB que se supone que contiene solo los M gb de datos más nuevos de dirA. Cuando se agregan archivos a dirA, también se deben agregar a dirB, mientras que los archivos más antiguos de dirB se deben eliminar.

¿Es eso posible con rsync? o algún otro software?

Respuesta1

He aquí un intento. Una advertencia: no he probado exhaustivamente el siguiente código.

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"

Algunas explicaciones:

  • El propósito de las partes find, sort, y awkes obtener una lista analizable por máquina (es decir, delimitada por nulos) de los archivos más nuevos, ordenados primero por los más nuevos, y luego truncar esa lista cuando el tamaño acumulado alcance 2 GiB (el 2147483648 es simplemente 2* 2^30 bytes o 2 GiB; ajuste este número al gusto).
    Nota:elmenos queLa comparación en la awkparte significa que el tamaño es un límite superior estricto (un "a lo sumo" condición), por lo que puede dar lugar a situaciones como las siguientes: si el archivo más nuevo fuera de 4 GiB, no se incluiría nada en la sincronización. Mueva al print $3principio de { }para obtener el comportamiento opuesto ("al menos"), en cuyo caso obtendría el archivo de 4 GiB y terminaría sincronizando el doble de lo previsto. Supuse que el primero era más deseable.
  • El primero rsyncextrae esos archivos a una ubicación temporal ( "$tmpdir") pero conserva la ruta ( -Rtambién conocida como --relative). Dado que utiliza enlaces físicos (usando --link-dest) y no una copia completa, este paso utiliza un espacio insignificante, pero $tmpdirdebe residir en el mismo sistema de archivos que $dirA.
  • La segunda rsyncinvocación realiza la sincronización $dirBy --deletela integración de archivos antiguos que $dirBno se encuentran en $tmpdir. La razón para usar el directorio temporal y hacerlo en dos pasos es que todavía no he encontrado una manera de hacer que la parte de eliminación funcione en un solo paso.

información relacionada