¿Cómo imprimir archivos que habrían sido cambiados usando rsync?

32

¿Hay alguna manera de hacer que rsync imprima las rutas de archivos completas a todos los archivos que son diferentes sin transferir realmente ningún archivo?

Alternativamente, necesito una forma de diferenciar los archivos en dos árboles (a través de SSH) basados ​​solo en el cambio de tamaño o el tiempo de la última modificación.

Joe Tsai
fuente

Respuestas:

33

Rsync tiene una dry-runopción:

-n, --dry-run               show what would have been transferred

No estoy seguro de si esto es lo que quieres.

Si desea que difflos archivos atraviesen dos árboles, puede buscar recursivamente las dos direcciones con find y pipe para enviar a ls y pipe a un archivo. Luego podría usar diffpara comparar los archivos.

Vincent
fuente
3
+1, esto está integrado en rsync. El detalle de la salida de --dry-rundependerá de su uso de -vy --progress options, por lo tanto, si no obtiene ninguna salida, verifique que estas opciones estén configuradas según sea necesario. Me di cuenta de que enviará nombres de directorio incluso cuando los archivos no hayan cambiado, pero puede filtrarlos pasando la salida a través de sedo similar.
David Spillett el
44
Pero --dry-run parece mostrar archivos incluso si son idénticos.
Quantum7
14

Prefiero usar el formato --out para ver los detalles, canalizándolo a menos:

rsync -azh --dry-run --delete-after --out-format="[%t]:%o:%f:Last Modified %M" source destination | less
kabZX
fuente
7

rsync -rvn localdir targetdir

El -n significa mostrar solo acciones (sin realizar ninguna acción).

¡Tenga en cuenta que necesita la 'v' o no le mostrará nada! (el resto de las respuestas olvidan esto ...)

Hugo Zaragoza
fuente
2
Para los seguidores -n es equivalente a "--dry-run" :)
rogerdpack
1

Basándose en otras respuestas y /server//a/618740/114520

  • use --dry-run(o -n) para evitar modificaciones
  • use --itemize-changes(o -i) para buscar cambios
  • use --archive(o -a) para obtener todos los subdirectorios
  • se usa egreppara filtrar las entradas que comienzan por punto (sin cambios)

Lo que te da: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\."

Si solo quiere una forma, puede cambiar el comando:

  • para cambios de origen a destino: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|<)"
  • para cambios desde el destino a la fuente: rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^(\.|>)"

Y si solo necesita los archivos, simplemente agregue awkmagia:rsync -nia source destination | egrep -v "sending incremental file list" | egrep -v "^\." | awk '{print $2}'

Yvan
fuente
0

Yo iría por algo como esto:

#! /bin/bash 

set -eu   ## Stop on errors and on undefined variables

## The local directory name
LOCAL_DIR=$1
## The remote directory in rsync sintax. Example: "machine:directory"
REMOTE_DIR=$2

shift 
shift 
# Now the first two args are gone and any other remaining arguments, if any, 
# can be expanded with $* or $@

# Create temporary file in THIS directory (hopefully in the same disk as $1:
# we need to hard link, which can only made in the same partition)
tmpd="$(mktemp -d  "$PWD/XXXXXXX.tmp" )"

# Upon exit, remove temporary directory, both on error and on success
trap 'rm -rf "$tmpd"' EXIT

# Make a *hard-linked* copy of our repository. It uses very little space 
# and is very quick 
cp -al "$LOCAL_DIR" "$tmpd"

# Copy the files. The final «"$@"» allows us to pass on arguments for rsync 
# from the command line (after the two directories).
rsync -a "$REMOTE_DIR"/   "$tmpd/"  --size-only "$@"

# Compare both trees
meld "$LOCAL_DIR"  "$tmpd"

Por ejemplo:

$ cd svn 
$ rsyncmeld myproject othermachine:myproject -v --exclude '*.svn' --exclude build
Raúl Salinas-Monteagudo
fuente
0

La verdad del asunto es que si ejecuta rsync -v ...y genera un nombre de archivo en la pantalla, ese archivo se está transfiriendo (o se habría transferido, si está haciendo un --dry-run). Para determinar por qué rsync estaba a punto de transferirlo, use el modo de detalle: /server//a/618740/27813

Como otros han señalado, de manera predeterminada, rsync solo se compara en función del tamaño del archivo y la marca de tiempo, que tienen que coincidir; de lo contrario, se inicia una "copia delta" en ese archivo. Si realmente desea ver qué archivos son diferentes, use el modo de suma de verificación "-c".

rogerdpack
fuente