Posso usar o rsync para criar uma lista apenas dos arquivos alterados?


26

Estou usando o rsync em um script bash para manter os arquivos sincronizados entre alguns servidores e um NAS. Um problema que encontrei é tentar gerar uma lista dos arquivos que foram alterados durante o rsync.

A idéia é que, quando executo o rsync, posso gerar os arquivos que foram alterados para um arquivo de texto - mais esperança para uma matriz na memória - e, antes que o script exista, posso executar uma tarefa apenas nos arquivos alterados.

Alguém encontrou uma maneira de realizar essa tarefa?

# specify the source directory
source_directory=/Users/jason/Desktop/source

# specify the destination directory
# DO NOT ADD THE SAME DIRECTORY NAME AS RSYNC WILL CREATE IT FOR YOU
destination_directory=/Users/jason/Desktop/destination

# run the rsync command
rsync -avz $source_directory $destination_directory

# grab the changed items and save to an array or temp file?

# loop through and chown each changed file
for changed_item in "${changed_items[@]}"
do
        # chown the file owner and notify the user
        chown -R user:usergroup; echo '!! changed the user and group for:' $changed_item
done

→ veja minha resposta aqui . Também -imais de itemize, mas com algumas torções ...
Frank Nocke

Respostas:


42

Você pode usar a opção rsync --itemize-changes( -i) para gerar uma saída analisável parecida com esta:

~ $ rsync src/ dest/ -ai
.d..t.... ./
>f+++++++ newfile
>f..t.... oldfile

~ $ echo 'new stuff' > src/newfile

~ $ !rsync
rsync src/ dest/ -ai
>f.st.... newfile

O >caractere na primeira posição indica que um arquivo foi atualizado, os caracteres restantes indicam o motivo, por exemplo, aqui se tindicam que o tamanho e o carimbo de data / hora do arquivo foram alterados.

Uma maneira rápida e suja de obter a lista de arquivos pode ser:

rsync -ai src/ dest/ | egrep '^>'

A análise obviamente mais avançada pode produzir uma saída mais limpa :-)

Encontrei este ótimo link enquanto tentava descobrir quando --itemize-changesfoi apresentado, muito útil:

http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (link arquivado)


2
Para uma saída mais limpa, como mencionado, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runlistaria apenas os arquivos modificados ( soma de verificação diferente ), definitivamente um detentor, thx :) FYI --dry-runapós o comando em vez de usar a nopção é para mim uma prática recomendada
MediaVince

Essencialmente o mesmo que rsync -zavc src/ dest/ --dry-runsem verboso
MediaVince

14

Use a -nbandeira, combinada com a -cbandeira da soma de verificação e a -ibandeira:

# rsync -naic test/ test-clone/
>fcst...... a.txt
>fcst...... abcde.txt
>fcst...... b.txt

Neste exemplo, apenas um arquivo foi alterado, com base no conteúdo do próprio arquivo. No entanto, nenhuma sincronização de arquivo é feita devido ao -nsinalizador

Bônus

Se você deseja executar o chown nos arquivos alterados, analise-os com sedou similar e processe com xargs, por exemplo:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"

3
sed->cut -d ' ' -f2,-
MUY Bélgica

-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner

Eu não estou seguindo. Todos os três arquivos no exemplo estão marcados com '> fcst', que eu entendo que significa 'sendo recebido do controle remoto', a soma de verificação difere, o tamanho difere, o tempo difere. O que na saída indica que "apenas um arquivo foi alterado"?
bobpaul 1/11

1

Esta pergunta é um pouco antiga, mas acho que vale a pena acrescentar:

-i é um atalho de --out-format=%i%n%L

E %nsignifica o nome do arquivo, (seção log formatde man rsyncd.conf)

PS rsync versão 3.1.0


Na verdade, esta resposta mencionou que opção
Cychih
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.