Obter lista de arquivos transferidos do rsync?

14

Atualmente, estou usando rsyncum script que implanta um aplicativo PHP de uma preparação para um servidor de produção. Aqui está como:

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

No momento, ele está exibindo uma lista de todos os arquivos que estão sendo comparados (todos os arquivos do projeto), mas eu gostaria que ele exibisse apenas os modificados, para que eu possa executá-lo com uma --dry-runopção para verificar se todas as implantações estão atualizando apenas o arquivo arquivos desejados.

OBSERVAÇÃO: O melhor que pude fazer até agora são grep fcstos resultados, mas estou procurando uma rsyncopção que tenha certeza de que está lá, mas não consigo encontrá-la nas páginas de manual.

Desde já, obrigado!

Mauro
fonte

Respostas:

6

Se houver uma opção rsync para fazer exatamente o que você está pedindo, também não a encontrei na página de manual. :-)

Dito isto, não vejo o problema de grepping a saída rsync -ipara analisar exatamente o que você precisa. Isso é legal e unix para mim.

Uma queixa exigente com seu comando rsync: o -ré redundante, como está implícito -a.

Kevin DeGraaf
fonte
2
Obrigado cara. Eu me pergunto por que (com a variedade de opções deste programa) não existe uma opção para isso. Parece bastante básico para mim.
Mauro
Oi Kevin, na verdade existe uma opção: o -Pprogresso faz exatamente isso na -nconfiguração dryrun, embora -itambém não esteja errado. Veja minha resposta abaixo.
Robert Riedl
6

Use a --out-formatopção

De acordo com a página do manual:

A especificação da --out-formatopção mencionará cada arquivo, diretório, etc. atualizado de maneira significativa (um arquivo transferido, um link simbólico / dispositivo recriado ou um diretório).

Se você precisar apenas dos nomes reais dos arquivos ( --out-format="%n"), seu comando dry run poderá se parecer com:

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


Quando o rsync é chamado -v, ele usa internamente esta opção com um formato padrão de "%n%L", que informa apenas o nome do arquivo e, se o item é um link, para onde aponta.

Mas isso também inclui um breve resumo no início e no final do processo de sincronização.

Para se livrar desse resumo, use a --out-formatopção diretamente.

Btw. -itambém usa internamente --out-format, mas com um formato de "%i %n%L".

gripe
fonte
3

A partir do rsync v3.1.0, lançado em 2013, existe o --infosinalizador que permite um controle mais refinado da saída.

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

Os --infosinalizadores disponíveis são:

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
fonte
1
Isso é incrível, obrigado. Eu não tinha idéia de que esse sinalizador existia porque eu uso um Mac - até o MacOS mais recente instala uma versão rsync de 2004 lol. Cheers Apple ...
twistedpixel
0

Não tenho certeza se isso difere entre as versões / opções usadas, mas na versão mys quando uso a -iopção, recebo uma lista como:

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

Portanto, uma solução simples para obter apenas uma lista de arquivos realmente transferidos é executada:

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

Isso simplesmente oculta todas as linhas que contêm f..T....... Tão eficazmente isso ocultará arquivos idênticos.

Nux
fonte
0

Na verdade, você meio que respondeu sua própria pergunta, já que seu comando original já a possui: --progress

Esta é a opção correta, embora a página de manual seja um pouco enigmática:

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

Meio que faz sentido, já que você invoca sua rsyncstring no modo dryrun, nenhum transer acontece, mas você ainda tem progresso: os arquivos que foram alterados e seriam transferidos.

Dessa forma, você obtém uma pequena lista organizada de todos os arquivos, por exemplo:

O destino já possui uma cópia do arquivo alterado que foi atualizada no arquivo de origem e antigo, que permanece inalterado. A fonte também possui um arquivo adicional: 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 invocarmos seu comando rsync, mas removermos a especificação do item -ie apenas adicionarmos 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)

Você obtém uma lista apenas dos arquivos que o rsync transfira: o arquivo alterado e o novo arquivo.

Robert Riedl
fonte