¿Puedo usar rsync para crear una lista de solo archivos modificados?

26

Estoy usando rsync en un script bash para mantener los archivos sincronizados entre algunos servidores y un NAS. Un problema con el que me he encontrado es intentar generar una lista de los archivos que han cambiado durante el rsync.

La idea es que cuando ejecuto rsync, puedo generar los archivos que han cambiado a un archivo de texto, más esperando una matriz en la memoria, y luego, antes de que exista el script, puedo ejecutar un chown solo en los archivos modificados.

¿Alguien ha encontrado una manera de realizar tal tarea?

# 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
Jason M.
fuente
→ mira mi respuesta aquí . También -ipara detallar, pero con algunos giros más ...
Frank Nocke

Respuestas:

42

Puede usar la opción rsync --itemize-changes( -i) para generar una salida analizable que se vea así:

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

~ $ echo 'new stuff' > src/newfile

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

El >carácter en la primera posición indica que se actualizó un archivo, los caracteres restantes indican por qué, por ejemplo, aquí se tindican que el tamaño del archivo y la marca de tiempo cambiaron.

Una forma rápida y sucia de obtener la lista de archivos podría ser:

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

Obviamente un análisis más avanzado podría producir una salida más limpia :-)

Me encontré con este gran enlace mientras intentaba saber cuándo --itemize-changesfue presentado, muy útil:

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

Kyle Smith
fuente
2
Para una salida más limpia como se mencionó, rsync -zaic src/ dest/ | grep '^?c' | cut -d' ' -f2 --dry-runsolo enumeraría los archivos modificados ( suma de verificación diferente ), definitivamente un guardián, gracias :) Colocar --dry-rundespués del comando en lugar de usar la nopción es para mí una práctica recomendada
MediaVince el
En esencia, el mismo que rsync -zavc src/ dest/ --dry-runsin verbosa
MediaVince
14

Use la -nbandera, combinada con la -cbandera de suma de control y la -ibandera:

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

En este ejemplo, solo un archivo ha cambiado, en función del contenido del archivo mismo. Sin embargo, no se realiza la sincronización de archivos debido a la -nmarca

Prima

Si desea ejecutar chown en los archivos modificados, analícelos con sedo similar y procese con xargs, por ejemplo:

rsync -naic test/ test-clone/ | sed 's/............//' | xargs -I+ sudo chown root "test-clone/+"
JDS
fuente
3
sed->cut -d ' ' -f2,-
MUY Bélgica
-n --dry-run, -c --checksum,-i --itemize-changes
ThorSummoner
No te estoy siguiendo. Los 3 de esos archivos en el ejemplo están marcados '> fcst', lo que entiendo significa 'ser recibido desde el control remoto', la suma de verificación difiere, el tamaño difiere, el tiempo difiere. ¿Qué en la salida indica que "solo un archivo ha cambiado"?
bobpaul
1

Esta pregunta es un poco vieja, pero creo que vale la pena agregarla:

-i es un atajo de --out-format=%i%n%L

Y %nsignifica el nombre de archivo, (sección log formatde man rsyncd.conf)

PS rsync versión 3.1.0

Cychih
fuente
En realidad, esta respuesta mencionó esa opción
Cychih