Reutilice rsync --dry-run output para acelerar la transferencia real más adelante

23

Normalmente lo hago rsync -nantes de hacer un real rsync. La cuestión es, ¿cómo podría automatizar la segunda ejecución para reutilizar exactamente la lista generada con --dry-run?

Quiero decir, si corro rsync -n, obtengo una simulación de lo rsyncque haría, mi idea sería tomar esa salida, procesarla y, de alguna manera, hacer rsyncsolo --include-fromesa salida, por lo que la lista completa solo debe calcularse una vez.

Si esto no tiene sentido, por favor, avíseme.

Por cierto, tiendo a usar rsync -hva --progress --stats --delete --exclude-from "$EXCLUDEFILE". Si también tiene una sugerencia sobre qué opciones usaría, hágamelo saber. Estoy tratando de duplicar el contenido de un disco duro externo (que solo contiene imágenes, videos y documentos) a otro disco duro externo.

Manuel
fuente
Puede intentar redirigir la salida del --dry-runcomando a un archivo (por ejemplo, rsync --dry-run -avz SOURCE DEST > include.txt), eliminar todas las líneas que no son archivos / rutas de include.txt y ejecutarlas rsync --include-from include.txt.
ThatGuy
Ese último comando debería ser rsync --include-from include.txt --exclude=* SOURCE DEST. Consulte stackoverflow.com/a/19296415/1765910 para más detalles.
ThatGuy
Sí, esa es la idea, pero no sé cómo hacerlo (además, me gustaría la aprobación de alguien que realmente sepa lo que está haciendo). Solo uso rsyncpero no sé nada de scripts de shell / bash ...
Manuel

Respuestas:

19

Ciertamente es posible usar la lista de archivos generada durante una ejecución en seco como un archivo de inclusión. Sin embargo, idealmente, las líneas adicionales en la parte superior e inferior de la salida de ejecución en seco deberían eliminarse.

Salida de ejemplo:

sending incremental file list
[LIST OF FILES]

sent 226 bytes  received 34 bytes  520.00 bytes/sec
total size is 648,373,274  speedup is 2,493,743.36 (DRY RUN)

Para eliminar estas líneas, canalice la rsyncsalida hacia adentro heady hacia adentro tail. Luego, guarde la salida procesada en un archivo de inclusión:

rsync --dry-run -avz source/ destination/ | head --lines=-3 | tail --lines=+3 > include.txt

Finalmente, indique rsyncque use el archivo de inclusión generado (agregando opciones adicionales según lo desee):

rsync --include-from=include.txt --exclude=* source/ dest/

Ese tipo
fuente
El problema con esto es que no hace frente a los archivos que deberían eliminarse. ¿Y es ese método tail/ headlo suficientemente robusto como para garantizar tener solo la lista de archivos?
Manuel
Agregar --deletehace que los archivos eliminados de los directorios de origen también se eliminen de los directorios de destino, al menos en la computadora en la que lo probé. Puede omitir la parte tail/ por headcompleto. rsyncinterpreta cada línea en el archivo de inclusión como un nombre de archivo y simplemente ignora los archivos no existentes, por lo que no sucederá nada si mantiene las líneas adicionales (a menos que tenga archivos llamados "envío de lista de archivos incrementales", etc., en cuyo caso estos archivos también se copiarán).
ThatGuy