Sorprendentemente, ninguna respuesta en 6 años usa la -i
opción o da una buena salida, así que aquí voy:
TLDR - Solo muéstrame los comandos
rsync -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
rsync -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
rsync -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
Comprender la salida
Aquí hay un ejemplo de la salida:
L file-only-in-Left-dir
R file-only-in-right-dir
X >f.st...... file-with-dif-size-and-time
X .f...p..... file-with-dif-perms
Tenga en cuenta el primer carácter de cada línea:
L
/ R
significa que el archivo / dir aparece solo en el directorio L
eft o R
ight.
X
significa que el archivo aparece en ambos lados, pero no es lo mismo (en cuyo caso los próximos 11 caracteres que dan más información. s
, t
y p
muestran diferencias en s ize, t iempo y p ermissions respectivamente - para obtener más información tratar man rsync
y buscar --itemize-changes
) .
Opciones adicionales que puede desear usar
Si desea comparar también el propietario / grupo / permisos de los archivos, agregue las opciones -o
/ -g
/ -p
respectivamente. Finalmente, tenga en cuenta que, de manera predeterminada, rsync considera que dos archivos son iguales si tienen el mismo nombre, hora y tamaño. Esto es extremadamente rápido y la mayoría de las veces es más que suficiente, pero si desea estar 100% seguro, agregue -c
también para comparar el contenido de los archivos con el mismo nombre, hora y tamaño.
TLDR: solo dame un script para llamar
Aquí está. Llámalo así
diff-dirs Left_Dir Right_Dir [options]
Todas las opciones mencionadas anteriormente en la sección "Opciones adicionales que quizás desee utilizar" también se aplican aquí.
#!/bin/bash
# Compare two directories using rsync and print the differences
# CAUTION: options MUST appear after the directories
#
# SYNTAX
#---------
# diff-dirs Left_Dir Right_Dir [options]
#
# EXAMPLE OF OUTPUT
#------------------
# L file-only-in-Left-dir
# R file-only-in-right-dir
# X >f.st...... file-with-dif-size-and-time
# X .f...p..... file-with-dif-perms
#
# L / R mean that the file/dir appears only at the `L`eft or `R`ight dir.
#
# X means that a file appears on both sides but is not the same (in which
# case the next 11 characters give you more info. In most cases knowing
# that s,t,T and p depict differences in Size, Time and Permissions
# is enough but `man rsync` has more info
# (look at the --itemize-changes option)
#
# OPTIONS
#---------
# All options are passed to rsync. Here are the most useful for the purpose
# of directory comparisons:
#
# -c will force comparison of file contents (otherwise only
# time & size is compared which is much faster)
#
# -p/-o/-g will force comparison of permissions/owner/group
if [[ -z $2 ]] ; then
echo "USAGE: $0 dir1 dir2 [optional rsync arguments]"
exit 1
fi
set -e
LEFT_DIR=$1; shift
RIGHT_DIR=$1; shift
OPTIONS="$*"
# Files that don't exist in Right_Dir
rsync $OPTIONS -rin --ignore-existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^[^ ]* /L /'
# Files that don't exist in Left_Dir
rsync $OPTIONS -rin --ignore-existing "$RIGHT_DIR"/ "$LEFT_DIR"/|sed -e 's/^[^ ]* /R /'
# Files that exist in both dirs but have differences
rsync $OPTIONS -rin --existing "$LEFT_DIR"/ "$RIGHT_DIR"/|sed -e 's/^/X /'
¿Como funciona?
Estamos llamando a rsync así:
rsync -rin ...
Usamos -i
( --itemize-changes
) para decirle a rsync que imprima una línea de salida para cada archivo que contiene información sobre cualquier diferencia entre los dos directorios. Necesitamos -n
suprimir el comportamiento normal de rsync (que es intentar sincronizar los dos directorios copiando / eliminando archivos). También necesitamos -r
trabajar recursivamente para todos los archivos / subdirectorios.
Llamamos a rsync tres veces:
Primera llamada : imprimir archivos que no existen en Dir_B. Necesitamos usar --ignore-existing
para ignorar los archivos que existen en ambos lados.
rsync -rin --ignore-existing $DIR_A/ $DIR_B/
2da llamada : exactamente como antes pero intercambiamos el orden de DIR_A / DIR_B.
3ra llamada : Finalmente, usamos --existing
para verificar solo los archivos que aparecen en ambos directorios.
rsync -rin --existing $DIR_A/ $DIR_B/