Ottieni l'elenco dei file trasferiti da rsync?


14

Attualmente sto usando rsyncuno script che distribuisce un'applicazione PHP da una gestione temporanea a un server di produzione. Ecco come:

rsync -rzai --progress --stats --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/

Questo sta attualmente producendo un elenco di tutti i file che vengono confrontati (tutti i file nel progetto), ma mi piacerebbe che producesse solo quelli modificati, quindi posso eseguirlo con --dry-runun'opzione per verificare che ogni distribuzione stia aggiornando solo il file desiderati.

NOTA: il meglio che ho potuto fare finora sono grep fcsti risultati, ma sto cercando rsyncun'opzione che sono sicuro che sia lì ma non riesco a trovarlo nelle pagine man.

Grazie in anticipo!

Risposte:


6

Se c'è un'opzione rsync per fare esattamente quello che stai chiedendo, non l'ho trovata nemmeno nella manpage. :-)

Detto questo, non vedo il problema con il grepping dell'output di rsync -ianalizzare esattamente ciò di cui hai bisogno. È bello e Unixy per me.

Un cavillo nit-picky con il tuo comando rsync: the -rè ridondante, come è implicito da -a.


2
Grazie uomo. Mi chiedo perché (con la varietà di opzioni di questo programma) non esiste un'opzione per questo. Sembra piuttosto semplice per me.
Mauro,

Ciao Kevin, in realtà c'è un'opzione: -Pper i progressi fa esattamente questo nell'ambientazione dei -ndryrun, anche se -inon è neanche sbagliato. Vedi la mia risposta qui sotto.
Robert Riedl,

6

Usa l' --out-formatopzione

Secondo la pagina man:

La specifica --out-formatdell'opzione menzionerà ogni file, directory, ecc. Che viene aggiornato in modo significativo (un file trasferito, un collegamento / dispositivo ricreato o una directory).

Se hai bisogno solo dei nomi di file effettivi ( --out-format="%n"), il tuo comando dry run potrebbe apparire come:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ root@app.com:/var/www/html/app/


Quando viene chiamato rsync -v, utilizza internamente questa opzione con un formato predefinito di "%n%L", che indica solo il nome del file e, se l'elemento è un collegamento, dove punta.

Ciò include anche un breve riepilogo all'inizio e alla fine del processo di sincronizzazione.

Per sbarazzarsi di quel riepilogo utilizzare --out-formatdirettamente l' opzione.

Btw. -iutilizza anche internamente --out-format, ma con un formato di "%i %n%L".


3

A partire da rsync v3.1.0, rilasciato nel 2013, c'è il --infoflag che consente un controllo accurato dell'output.

 --info=FLAGS
          This option lets you have fine-grained control over the information output you want to see.  An individual flag name may be followed
          by a level number, with 0 meaning to silence that output, 1 being the default output level, and higher numbers increasing the output
          of that flag (for those that support higher levels).  Use --info=help to see all the available flag names,  what  they  output,  and
          what flag names are added for each increase in the verbose level.  Some examples:

              rsync -a --info=progress2 src/ dest/
              rsync -avv --info=stats2,misc1,flist0 src/ dest/

          Note  that  --info=names  output  is  affected  by the --out-format and --itemize-changes (-i) options.  See those options for more
          information on what is output and when.

          This option was added to 3.1.0, so an older rsync on the server side might reject your attempts at fine-grained control (if  one  or
          more  flags  needed  to  be  send to the server and the server was too old to understand them).  See also the "max verbosity" caveat
          above when dealing with a daemon.

I --infoflag disponibili sono:

Use OPT or OPT1 for level 1 output, OPT2 for level 2, etc.; OPT0 silences.

BACKUP     Mention files backed up
COPY       Mention files copied locally on the receiving side
DEL        Mention deletions on the receiving side
FLIST      Mention file-list receiving/sending (levels 1-2)
MISC       Mention miscellaneous information (levels 1-2)
MOUNT      Mention mounts that were found or skipped
NAME       Mention 1) updated file/dir names, 2) unchanged names
PROGRESS   Mention 1) per-file progress or 2) total transfer progress
REMOVE     Mention files removed on the sending side
SKIP       Mention files that are skipped due to options used
STATS      Mention statistics at end of run (levels 1-3)
SYMSAFE    Mention symlinks that are unsafe

ALL        Set all --info options (e.g. all4)
NONE       Silence all --info options (same as all0)
HELP       Output this help message

Options added for each increase in verbose level:
1) COPY,DEL,FLIST,MISC,NAME,STATS,SYMSAFE
2) BACKUP,MISC2,MOUNT,NAME2,REMOVE,SKIP

1
Questo è fantastico, grazie. Non avevo idea che questo flag esistesse perché uso un Mac - anche l'ultimo MacOS installa una versione rsync dal 2004 lol. Saluti Apple ...
twistedpixel,

0

Non sono sicuro se questo differisce tra le versioni / opzioni utilizzate ma nella versione mys quando uso l' -iopzione ottengo un elenco come:

>f..T...... existing-file.png
>f+++++++++ new-file.png
cd+++++++++ new-dir/
>f+++++++++ new-dir/new-file.png

Quindi una semplice soluzione per ottenere solo un elenco di file effettivamente trasferiti è sufficiente eseguire:

rsync [your options here] | grep -v "f..T......"

Questo nasconderà semplicemente tutte le righe che contengono f..T....... Così efficacemente questo nasconderà file identici.


0

In realtà, hai risposto alla tua domanda, dato che il tuo comando originale lo ha già: --progress

Questa è l'opzione corretta, sebbene la pagina man sia un po 'enigmatica al riguardo:

     --progress              show progress during transfer
 -P                          same as --partial --progress

In un certo senso ha senso, dal momento che invochi la tua rsyncstringa con la modalità dryrun, non accade alcun transer, ma avresti comunque dei progressi: vale a dire i file che sono stati modificati e verrebbero trasferiti.

In questo modo ottieni un piccolo elenco di tutti i file, ad esempio:

La destinazione ha già una copia del file modificato che è stato aggiornato nell'origine e nel vecchio file, che rimane invariato. Il sorgente ha anche un file aggiuntivo: newfile.

#~$ ls -lhan /tmp/destination/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:08 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile



#~$ ls -lhan /tmp/source/
total 20K
drwxrwxr-x  2 1000 1000 4,0K Jän 31 09:07 .
drwxrwxrwt 18    0    0  12K Jän 31 09:15 ..
-rw-rw-r--  1 1000 1000    2 Jän 31 09:15 changedfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 newfile
-rw-rw-r--  1 1000 1000    0 Jän 31 09:07 oldfile

Se poi invochiamo il tuo comando rsync, ma rimuoviamo il dettaglio -ie aggiungiamo semplicemente dryrun-n

#~$ ~$ rsync -n -rza --progress --stats --ignore-times --checksum /tmp/source/ /tmp/destination/
sending incremental file list
changedfile
newfile

Number of files: 4 (reg: 3, dir: 1)
Number of created files: 1 (reg: 1)
Number of deleted files: 0
Number of regular files transferred: 2
Total file size: 2 bytes
Total transferred file size: 2 bytes
Literal data: 0 bytes
Matched data: 0 bytes
File list size: 0
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 187
Total bytes received: 22

sent 187 bytes  received 22 bytes  418.00 bytes/sec
total size is 2  speedup is 0.01 (DRY RUN)

Viene visualizzato un elenco dei soli file che rsync tranfser: changefile e newfile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.