Je cherche un moyen de filtrer / rediriger la sortie rsync de manière à ce qu'elle puisse être alimentée par la commande "dialog --gauge", afin que je puisse obtenir une barre de progression agréable lors de la synchronisation des fichiers. Actuellement, je ne l'ai testé que directement à l'invite, mais je prévois de le faire dans un script shell (bash).
J'ai regardé sur Internet et trouvé des morceaux, mais il me manque encore quelque chose pour le faire fonctionner
(Avertissement: cela pourrait être une approche totalement erronée, et c'est une monstruosité de redirection / piping)
Ce que j'ai actuellement rassemblé:
rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data | awk -f /home/user/rsync.awk | sed 's/\([0-9]*\).*/\1/' | dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
J'ai d'abord la commande rsync réelle avec l'option --progress La sortie de rsync est dirigée vers awk et utilise le filtre awk suivant:
{
if (index($0, "to-check=") > 0)
{
split($0, pieces, "to-check=")
split(pieces[2], term, ")");
split(term[1], division, "/");
print (1-(division[1]/division[2]))*100
}
# else
# {
# print "#"$0;
# }
fflush();
}
Cela filtre la sortie rsync et fournit le pourcentage au format suivant:
53.7037
55.5556
57.4074
59.2593
61.1111
62.963
Donc, pour se débarrasser des nombres décimaux, je fournis la sortie à sed:
sed 's/\([0-9]*\).*/\1/'
Ce qui donne la sortie suivante:
64
66
68
70
72
74
75
77
Ces chiffres sont canalisés dans une boîte de dialogue comme celle-ci:
dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
Pour autant que je sache, "dialog --gauge" etc. devrait accepter cela, mais il affiche simplement la progression à 0% jusqu'à ce qu'elle atteigne soudainement 100%
Quelqu'un peut-il me diriger dans la bonne direction ici? Suis-je loin d'une barre de progression fonctionnelle? Existe-t-il un meilleur moyen d'y parvenir?
Cordialement,
Christer
EDIT : Après avoir pris en compte la réponse de @lynxlynxlynx, la ligne de commande correcte est:
rsync -avz --progress -e "ssh" user@server:/home/user/data/ /home/user/data \
| awk -f /home/user/rsync.awk \
| sed --unbuffered 's/([0-9]*).*/\1/' \
| dialog --title "My Gauge" --gauge "Hi, this is a gauge widget" 20 70
Réponses:
fonctionne bien, donc @Shadur a raison et il y a un tampon en jeu.
L'ajout du
sed
décapant dans le mix montre qu'il est le coupable (affiche uniquement 0 et 30):Maintenant que le problème est connu, vous avez plusieurs options. Le plus propre serait d'arrondir / couper le pourcentage
awk
avec des mathématiques ou une manipulation de chaînes, mais puisque vous avez GNUsed
, il suffit d'ajouter-u
ou de--unbuffered
faire l'affaire.Cependant, par souci d'exhaustivité, un cas de test simple montre
awk
également la mise en mémoire tampon:Mais vous gérez déjà cela avec
fflush
, donc je ne m'attends pas à des problèmes.la source