¿Es posible comparar dos directorios con rsync y solo imprimir las diferencias? Hay una opción de ejecución en seco, pero cuando aumento la verbosidad a un cierto nivel, se muestran todos los archivos comparados.
ls -alR
y diff
no es una opción aquí, ya que hay enlaces duros en la fuente que hacen que cada línea sea diferente. (Por supuesto, podría eliminar esta columna con perl).
directory
rsync
file-comparison
Chris
fuente
fuente
Respuestas:
Probablemente tendrá que ejecutar algo parecido
rsync -avun --delete
en ambas direcciones.Pero, ¿qué estás tratando de lograr realmente?
Actualización :
rsync -avun --delete $TARGET $SOURCE |grep "^deleting "
le dará una lista de archivos que no existen en el directorio de destino."grep delet" porque cada línea imprime: delet ing ..file ..
rsync -avun $SOURCE $TARGET
le dará una lista de archivos "diferentes" (incluidos los archivos nuevos).fuente
Para agregar a la respuesta de Nils (para cualquiera que se encuentre con esto a través de Google), por defecto
rsync
solo compara los tamaños de archivo y los tiempos de modificación para saber si hay alguna diferencia. (Si son diferentes, hace más, pero si son iguales, se detiene allí).Si desea comparar el contenido real del archivo , incluso para archivos que tienen el mismo tamaño y la última hora de modificación, agregue la bandera
-c
para indicarrsync
que compare los archivos usando una suma de verificación.(La
-u
opción le dice a rsync para ignorar los archivos que son nuevos en$TARGET
que en$SOURCE
que es probable que no desee si está comparando su contenido.)fuente
--no-group --no-owner --no-perms --no-times
o una combinación de estos según sus necesidades.-a
lugar de-a
, por ejemplorsync -rlDcnv --delete $SOURCE $TARGET
--delete
a la lista los archivos que solo existen en$TARGET
Solo para aquellos menos familiarizados con
rsync
:-n
: bit más importante: no cambie nada;-rc
: compare solo los contenidos (de lo contrario, use-ac
);-v
: enumerar los archivos)--delete
: busque una diferencia simétrica, no unidireccional./
significa "mirar dentro del directorio y comparar su contenido con el destino".PD. Sé que es un PS terrible, pero de hecho se agregó rápidamente. Sin embargo, apuesto a que uno puede encontrar esto útil.
PPS Alternativamente, uno también podría hacer
Si los nombres de archivo no contienen nuevas líneas, podemos ordenar ambos
*.md5
archivos ydiff
ellos. (Sin embargo, esto solo funcionará para archivos; es decir, no se detectará un directorio vacío a ambos lados).fuente
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
Comprender la salida
Aquí hay un ejemplo de la salida:
Tenga en cuenta el primer carácter de cada línea:
L
/R
significa que el archivo / dir aparece solo en el directorioL
eft oR
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
yp
muestran diferencias en s ize, t iempo y p ermissions respectivamente - para obtener más información tratarman 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í
Todas las opciones mencionadas anteriormente en la sección "Opciones adicionales que quizás desee utilizar" también se aplican aquí.
¿Como funciona?
Estamos llamando a rsync así:
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.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.fuente
--rsync-path="sudo rsync"
a cada comando rsync. En segundo lugar, quería comparar el directorio local con el directorio remoto. Agregué--rsh "ssh -p1234"
porque en mi caso SSH se está ejecutando en el puerto 1234. Luego llamé a script comodiff-dirs [email protected]:/mnt/Vol1/dir1/ /localMnt/dir1 -c
.Según su pregunta, entiendo que no desea usar diff en ls , pero también puede usar diff de forma recursiva en los directorios:
fuente
Me tomó algunos intentos para que esto funcione. La respuesta de Nils requiere que
$TARGET
termine en un final/
, como se explica por ジ ョ ー ジ.Aquí hay una versión que agrega explícitamente el final
/
:Esto proporciona la lista de archivos que existen debajo del
${SOURCE}
directorio pero no debajo del${TARGET}
directorio.Utilizo
sed
aquí para eliminar el iniciodeleting
de las líneas de salida y para imprimir solo esas líneas.No uso la
rsync
opción-c
porque comparar el contenido del archivo sería mucho más lento para mis casos de uso, y comparar solo los tamaños de archivo y los tiempos de modificación también parece suficiente en estos casos. No tengo ninguna razón para sospechar que mis computadoras sufren problemas de distorsión del reloj o que algo cambió maliciosamente las marcas de tiempo. Además, el resultado de-c
no puede cambiar la decisión de eliminar un archivo, solo la decisión de actualizar o mantener un archivo.También uso
-u
y-a
(en lugar de-r
), para que luego pueda reutilizar la línea de comando y cambiarla para copiar los directorios y archivos seleccionados de${SOURCE}
a${TARGET}
, de esta manera:fuente
Tengo otra idea de hacer esto:
Puede hacer coincidir "FILEDETAIL ::" con la salida del comando. Además, puede cambiar la cadena "FILEDETAIL ::". El "% n" es el nombre del archivo.
-r Esto le dice a rsync que copie directorios recursivamente.
-n Esto hace que rsync realice una ejecución de prueba que no realiza ningún cambio.
fuente