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

24

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

A ideia é que quando eu executo o rsync, eu posso mostrar os arquivos que foram alterados em um arquivo de texto - mais esperando por um array na memória - então antes que o script exista eu posso executar um chown somente os 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
    
por Jason M. 07.08.2014 / 16:30

3 respostas

35

Você pode usar a opção --itemize-changes ( -i ) do rsync para gerar uma saída analisável semelhante a 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 por que, por exemplo, aqui s e t indicam que o tamanho do arquivo e o registro de data e hora foram alterados.

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

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

Obviamente, uma análise mais avançada poderia produzir uma saída mais limpa: -)

Me deparei com esse ótimo link enquanto tentava descobrir quando o --itemize-changes foi introduzido, muito útil:

link (link arquivado)

    
por 07.08.2014 / 16:45
13

Use o sinalizador -n , combinado com o sinalizador -c checksum e o sinal -i :

# 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 arquivos é feita devido ao -n flag

Bônus

Se você quiser executar chown nos arquivos alterados, analise-os com sed ou similar e processe com xargs, por exemplo:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"
    
por 07.08.2014 / 16:56
1

Esta questão é um pouco antiga, mas acho que vale a pena acrescentar:

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

E %n significa o nome do arquivo, (seção log format de man rsyncd.conf )

P.S. rsync versão 3.1.0

    
por 06.02.2018 / 15:40