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
-i
mais de itemize, mas com algumas torções ...Respostas:
Você pode usar a opção rsync
--itemize-changes
(-i
) para gerar uma saída analisável parecida com esta:O
>
caractere na primeira posição indica que um arquivo foi atualizado, os caracteres restantes indicam o motivo, por exemplo, aquis
et
indicam 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-changes
foi apresentado, muito útil:http://andreafrancia.it/2010/03/understanding-the-output-of-rsync-itemize-changes.html (link arquivado)
fonte
rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-run
listaria apenas os arquivos modificados ( soma de verificação diferente ), definitivamente um detentor, thx :) FYI--dry-run
após o comando em vez de usar an
opção é para mim uma prática recomendadarsync -zavc src/ dest/ --dry-run
sem verbosoUse a
-n
bandeira, combinada com a-c
bandeira da soma de verificação e a-i
bandeira: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
-n
sinalizadorBônus
Se você deseja executar o chown nos arquivos alterados, analise-os com
sed
ou similar e processe com xargs, por exemplo:fonte
sed
->cut -d ' ' -f2,-
-n --dry-run
,-c --checksum
,-i --itemize-changes
Esta pergunta é 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çãolog format
deman rsyncd.conf
)PS rsync versão 3.1.0
fonte