4 votes

Rsync seulement les N Go les plus récents de fichiers

J'ai deux répertoires, dirA qui contient N Go de données et dirB qui est censé contenir uniquement les M derniers Go de données de dirA. Lorsque des fichiers sont ajoutés à dirA, ils doivent également être ajoutés à dirB, tandis que les fichiers les plus anciens de dirB doivent être supprimés.

Est-ce possible avec rsync ? ou un autre logiciel ?

1voto

Flotolk Points 263

Voici une tentative. Un mot de prudence : je n'ai pas testé le code suivant de manière exhaustive.

dirA=/chemin/vers/dirA
dirB=/autre/chemin/vers/dirB

tmpdir=/chemin/vers/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"

Quelques explications :

  • L'objectif des parties find, sort et awk est d'obtenir une liste des fichiers les plus récents, triés par date de création, de manière machine-parsable (c'est-à-dire délimitée par des caractères nuls), puis de tronquer cette liste lorsque la taille cumulée atteint 2 Gio (le 2147483648 représente simplement 2*2^30 octets, soit 2 Gio; ajustez ce nombre selon vos préférences).
    Remarque : la comparaison "inférieur à" dans la partie awk signifie que la taille est une limite supérieure stricte (une condition "au maximum"), ce qui peut entraîner des situations comme la suivante : si le fichier le plus récent faisait 4 Gio, rien ne serait inclus dans la synchronisation. Déplacez le print $3 au début du bloc { } pour obtenir le comportement opposé ("au moins"), auquel cas vous obtiendriez le fichier de 4 Gio et finiriez par synchroniser le double de ce que vous aviez prévu. J'ai supposé que le premier était plus souhaitable.
  • Le premier rsync extrait ces fichiers vers un emplacement temporaire ("$tmpdir") mais préserve le chemin (-R alias --relative). Comme il utilise des liens physiques (en utilisant --link-dest) et non une copie complète, cette étape utilise un espace négligeable, mais $tmpdir doit résider dans le même système de fichiers que $dirA.
  • La deuxième invocation de rsync effectue la synchronisation réelle avec $dirB et la suppression des anciens fichiers de $dirB non trouvés dans $tmpdir. La raison d'utiliser le répertoire temporaire et de faire cela en deux étapes est que je n'ai pas encore trouvé de moyen de faire fonctionner la partie suppression en une seule étape.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X