Posso usare rsync per creare un elenco di soli file modificati?


26

Sto usando rsync in uno script bash per mantenere i file sincronizzati tra alcuni server e un NAS. Un problema che ho riscontrato è il tentativo di generare un elenco dei file che sono stati modificati durante il rsync.

L'idea è che quando eseguo rsync, posso produrre i file che sono stati modificati in un file di testo - sperando di più in un array in memoria - quindi prima che esista lo script posso eseguire un chown solo sui file modificati.

Qualcuno ha trovato il modo di eseguire tale compito?

# 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

→ vedi la mia risposta qui . Anche -iper itemize, ma con qualche altra svolta ...
Frank Nocke,

Risposte:


42

È possibile utilizzare l' opzione di rsync --itemize-changes( -i) per generare un output analizzabile simile al seguente:

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

~ $ echo 'new stuff' > src/newfile

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

Il >carattere nella prima posizione indica che un file è stato aggiornato, i caratteri rimanenti indicano perché, ad esempio qui se tindicano che le dimensioni del file e il timestamp sono cambiati.

Un modo rapido e sporco per ottenere l'elenco dei file potrebbe essere:

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

Ovviamente l'analisi più avanzata potrebbe produrre risultati più puliti :-)

Mi sono imbattuto in questo fantastico link mentre cercavo di scoprire quando è --itemize-changesstato introdotto, molto utile:

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


2
Per un output più pulito come menzionato, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runelencherei solo i file modificati ( checksum diverso ), sicuramente un custode, grazie :) Cordiali saluti mettere --dry-rundopo il comando invece di utilizzare l' nopzione è per me una buona pratica
MediaVince il

Sostanzialmente lo stesso che rsync -zavc src/ dest/ --dry-runsenza verbose
MediaVince il

14

Usa la -nbandiera, combinata con la -cbandiera checksum e la -ibandiera:

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

In questo esempio, è cambiato solo un file, in base al contenuto del file stesso. Tuttavia, la sincronizzazione dei file non viene eseguita a causa del -nflag

indennità

Se vuoi eseguire chown sui file modificati, analizzali con sedo simili e processali con xargs, ad esempio:

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

3
sed->cut -d ' ' -f2,-
MUY Belgio,

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

Non sto seguendo. Tutti e 3 questi file nell'esempio sono contrassegnati con "> primo" che intendo significa "essere ricevuto dal telecomando", il checksum differisce, le dimensioni differiscono, il tempo differisce. Cosa nell'output indica che "è cambiato solo un file" ??
bobpaul

1

Questa domanda è un po 'vecchia, ma penso che valga la pena aggiungerla:

-i è una scorciatoia di --out-format=%i%n%L

E %nindica il nome file, (sezione log formatdi man rsyncd.conf)

PS rsync versione 3.1.0


In realtà questa risposta menzionava
quell'opzione
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.