Crea un directory de diff recursivo. Copiar reference y diff Recrea el directory original

Tengo varios directorys / resources de sitios web, cada uno tiene un tamaño total de varios gigabytes. Son más del 90% iguales. A veces solo se modifican algunos files.
Necesito download estos files periódicamente para fines de copy de security. El espacio de almacenamiento no es una preocupación, pero se está tardando demasiado en download.

Me gustaría:
Use uno de esos directorys como reference (d1).
1. Para otro directory (d2), liste todos los files que son idénticos entre d1 y d2, guárdelo en common.txt. Idéntico significa ruta relativa (dentro de d1 y d2), el nombre del file y el contenido son los mismos, ignorando el propietario / grupo y las marcas de time.
2. Copie todos los files, que están en d2 pero no en d1 (incluye files diferentes) en d3.

Luego downloadé tarballed d1, d3 y common.txt a otra máquina.

Copia d3 a d2.
3. Copie los files listdos en common.txt de d1 a d2.

¿Podría sugerirnos cómo resolver los pasos (1), (2), (3)?

Considera la deduplicación. ¿Hay algo que modifique esos files directamente en su server (en lugar de eliminar y cargar algo nuevo)? Si no lo hay, puede enlazar o enlazar los files idénticos directamente. Eso ahorraría espacio de almacenamiento en su server, y también resolvería automáticamente su problema de descarga, cuando se utiliza rsync -H que admite enlaces duros. Mientras seas consciente de las dificultades de los enlaces duros (la modificación in situ para uno los modifica a todos, ya que literalmente son el mismo file), esa es la mejor solución con diferencia.

Puede usar fdupes para encontrar files duplicates de manera eficiente. Eso cubre duplicates de contenido, desafortunadamente no hay ningún requisito para el nombre del file. Puede usar eso y luego filtrar la list de duplicates para los nombres de file; o podrías hacer la comparación tú mismo. Usando find , stat , cmp .

Ejemplo completamente sin refinar:

 cd d1 find -type f -exec ./compare.sh d1/{} d2/{} 

compare.sh:

 if [ -f "$1" -a -f "$2" ] then asize=`stat -c%s "$1"` bsize=`stat -c%s "$2"` if [ "$asize" == "$bsize" ] then if cmp "$1" "$2" then echo IDENTICAL "$1" "$2" else echo DIFFERENT "$1" "$2" fi fi fi 

Como mencionó los files tar --files-from / --exclude-from , en lugar de simplemente hacer eco de si un file es idéntico o diferente, simplemente puede hacer que se incluyan en una list de files de inclusión / exclusión para su uso con tar --files-from / --exclude-from .