Obtenir la liste des fichiers transférés à partir de rsync?

14

J'utilise actuellement rsyncun script qui déploie une application PHP à partir d'un transfert vers un serveur de production. Voici comment:

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

Cela génère actuellement une liste de tous les fichiers qui sont comparés (tous les fichiers du projet), mais j'aimerais qu'il ne génère que les fichiers modifiés, je peux donc l'exécuter avec une --dry-runoption pour vérifier que chaque déploiement ne met à jour que le fichiers souhaités.

REMARQUE: le mieux que j'ai pu faire jusqu'à présent est grep fcstles résultats, mais je recherche une rsyncoption qui est sûre, mais je ne la trouve pas dans les pages de manuel.

Merci d'avance!

Mauro
la source

Réponses:

6

S'il existe une option rsync pour faire exactement ce que vous demandez, je ne l'ai pas trouvée non plus dans la page de manuel. :-)

Cela dit, je ne vois pas le problème avec la récupération de la sortie de rsync -ipour analyser exactement ce dont vous avez besoin. Cela me semble agréable et Unixy.

Un petit problème avec votre commande rsync: le -rest redondant, comme cela est impliqué par -a.

Kevin DeGraaf
la source
2
Merci mec. Je me demande pourquoi (avec la variété des options de ce programme) il n'y a pas d'option pour ça. Semble assez basique pour moi.
Mauro
Salut Kevin, en fait, il y a une option: -Ppour le progrès, c'est exactement ce qui se passe dans le -ncadre du dryrun, mais ce -in'est pas faux non plus. Voir ma réponse ci-dessous.
Robert Riedl
6

Utilisez l' --out-formatoption

Selon la page de manuel:

La spécification de l' --out-formatoption mentionnera chaque fichier, répertoire, etc. qui est mis à jour de manière significative (un fichier transféré, un lien symbolique / périphérique recréé ou un répertoire).

Si vous n'avez besoin que des noms de fichiers réels ( --out-format="%n"), votre commande d'exécution à sec pourrait ressembler à ceci:

rsync -rzan --out-format="%n" --ignore-times --checksum /tmp/app_export/ [email protected]:/var/www/html/app/


Lorsque rsync est appelé avec -v, il utilise en interne cette option avec un format par défaut de "%n%L", qui vous indique uniquement le nom du fichier et, si l'élément est un lien, où il pointe.

Mais cela inclut également un bref résumé au début et à la fin du processus de synchronisation.

Pour vous débarrasser de ce résumé, utilisez --out-formatdirectement l' option.

Btw. -iutilise également en interne --out-format, mais avec un format de "%i %n%L".

grippe
la source
3

À partir de rsync v3.1.0, sorti en 2013, il y a le --infodrapeau qui permet un contrôle fin sur la sortie.

 --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.

Les --infodrapeaux disponibles sont:

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
Corneliu
la source
1
C'est génial, merci. Je ne savais pas que ce drapeau existait parce que j'utilise un Mac - même le dernier MacOS installe une version rsync de 2004 lol. Cheers Apple ...
twistedpixel
0

Je ne sais pas si cela diffère entre les versions / options utilisées, mais dans la version mys lorsque j'utilise l' -ioption, j'obtiens une liste comme:

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

Donc, une solution simple pour obtenir uniquement une liste des fichiers réellement transférés est simplement exécutée:

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

Cela masquera simplement toutes les lignes contenant f..T....... Si efficacement, cela masquera des fichiers identiques.

Nux
la source
0

En fait, vous avez en quelque sorte répondu à votre propre question, car votre commande d'origine l'a déjà: --progress

C'est l'option correcte, bien que la page de manuel soit un peu cryptée:

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

Cela a un peu de sens, puisque vous invoquez votre rsyncchaîne avec le mode dryrun, aucun transfert ne se produit, mais vous auriez encore des progrès: à savoir les fichiers qui ont changé et qui seraient transférés.

De cette façon, vous obtenez une petite liste soignée de tous les fichiers, par exemple:

La destination possède déjà une copie du fichier modifié qui a été mis à jour dans la source et de l'ancien fichier, qui reste inchangé. La source a également un fichier supplémentaire: 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

Si nous -iinvoquons ensuite votre commande rsync, mais supprimons l'item et ajoutez simplement 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)

Vous obtenez une liste des seuls fichiers que rsync transfèrerait: changéfichier et nouveaufichier.

Robert Riedl
la source