tempo fa scrissi uno script per fare dei backup incrementali. Man mano che la mia conoscenza di bash cresceva, il codice dello script è stato ampliato e rivisto una miriade di volte e, allo stato attuale, è una cosa piuttosto efficiente... ma non mi convince il feedback che da durante l'esecuzione.
Il cuore sello script è questo:
Codice: Seleziona tutto
rsync -azhv --stats --info=name0 --info=progress2 --del --exclude-from=$EXFILE --link-dest="$DESTDIR"/old "$ORIG"/ "$DESTDIR"/$NEW/
DESTDIR è la directory dove tengo tutti i backup, "old" è il backup precedente e NEW quello che si sta creando. ORIG è, ovviamente, la directory di cui fare il backup ( di solito, / ).
L'efficienza dello script ruota attorno al parametro "--link-dest" che, per i file presenti in tutti e due i backup senza variazioni, crea hardlinks invece di copie, risparmiando su tempo e spazio occupato.
Il problema è che, rsync, anche quando forzato a dare statistiche "totali" con "--info=name0 --info=progress2", è una fonte del tutto inattendibile, perché fa la scansione della sorgente _durante_ la copia e non prima... per cui ci sono casi in cui si passa dal 90% al 60% di completamento....
La soluzione sarebbe lanciare due volte rsync, la prima in "dry run" da usare come fonte per creare una barra di avanzamento; oppure forzarlo ad indicizzare tutti i file prima della copia... ma entrambi i sistemi sono del tutto inefficienti: il primo quasi raddoppia il tempo d'esecuzione dello script, mentre il secondo ne aumenta di pareccio l'uso di CPU e memoria...
Ora, possibile che non ci sia un modo di ottenere dati attendibili sulla durata del processo e, magari, convertirli in una elegante progressbar ascii??
Se serve, posso postare l'intero script, ma è piuttosto lungo e non credo che altre sue parti siano rilevanti...