¿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.

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.


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

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 ...)


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}'


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

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".

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.