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
, yawk
es 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 laawk
parte 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 alprint $3
principio 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
rsync
extrae esos archivos a una ubicación temporal ("$tmpdir"
) pero conserva la ruta (-R
tambié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$tmpdir
debe residir en el mismo sistema de archivos que$dirA
. - La segunda
rsync
invocación realiza la sincronización$dirB
y--delete
la integración de archivos antiguos que$dirB
no 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.