rsync: ¿crea un archivo temporal durante la transferencia?

37

Por lo que puedo ver, rsync no crea el archivo en el directorio de destino hasta que se completa.

Esto debe significar que crea el archivo en un directorio temporal en algún lugar y copia el archivo en el directorio de destino cuando está completo.

En primer lugar, ¿es esto correcto?

Si es verdadero, ¿es posible que rsync establezca no usar un directorio temporal y en su lugar cree el archivo en el directorio de destino y simplemente siga escribiendo en él hasta que esté completo?

Leopardo cazador
fuente

Respuestas:

46

Sí, crea un archivo temporal.

De acuerdo con la página del manual , puede especificar el directorio en el que se almacena el archivo temporal con el parámetro -T como en

-T, --temp-dir = DIR crea archivos temporales en el directorio DIR

La respuesta a la segunda parte de su pregunta también se puede encontrar allí:

--en su lugar

Esta opción cambia la forma en que rsync transfiere un archivo cuando los datos del archivo deben actualizarse: en lugar del método predeterminado de crear una nueva copia del archivo y colocarlo en su lugar cuando está completo, rsync escribe los datos actualizados directamente en el destino archivo.

superusuario0
fuente
44
¡Nota IMPORTANTE! La pregunta supone que rsync "copia el archivo en su lugar", mientras que la documentación de rsync especifica que rsync en realidad está "moviéndolo a su lugar", que es una DISTINCIÓN IMPORTANTE . Esto garantiza que el archivo aparezca en la ubicación de destino de forma atómica . Esto es útil para evitar condiciones de carrera en las que otra aplicación está esperando que aparezca el archivo de destino e inmediatamente lo abre para leer, pero el archivo no se está copiando.
Ogre Psalm33
15

Sí crea un archivo temporal, por defecto en el directorio de destino y con nombre .<FILE_NAME>.<RANDOM_STRING>. Entonces, si está copiando foo.txt, creará un archivo tmp llamado .foo.txt.GV4H3( GV4H3es la cadena aleatoria que será diferente cada vez que lo ejecute). Puede controlar este comportamiento utilizando estas rsyncopciones:

   --partial
          By default, rsync will delete any partially transferred
          file if the transfer is interrupted.  In  some  circum‐
          stances  it  is more desirable to keep partially trans‐
          ferred files. Using the --partial option tells rsync to
          keep  the  partial  file which should make a subsequent
          transfer of the rest of the file much faster.

   --partial-dir=DIR
          A better way to keep partial files than  the  --partial
          option  is  to  specify a DIR that will be used to hold
          the partial data (instead of writing it out to the des‐
          tination file).  On the next transfer, rsync will use a
          file found in this dir as data to speed up the  resump‐
          tion  of  the  transfer and then delete it after it has
          served its purpose.

Lea las partes relevantes de la rsyncpágina de manual (el siguiente es solo un pequeño extracto de la gran sección sobre cómo usar --partial-dir).

terdon
fuente
5

rsync crea archivos temporales en el directorio de destino. Ese archivo se llama como la fuente pero con una extensión. Podría ser así:

source: foo.bar 
target temp: foo.bar.hzmkjt7 (hzmkjt7 is just an example) 

La extensión se elimina después de que se haya verificado que el archivo es una copia exacta de la fuente. Durante el proceso de cambio de nombre, se establecen la propiedad, los permisos y el tiempo de modificación. Por lo tanto, es posible que no vea el archivo debido a los permisos. Asegúrese de tener permiso suficiente para ver todos los archivos y aquellos que no son de su propiedad para ver los archivos temporales.

Simon
fuente
Un proceso crea archivos con los permisos del usuario que lo ejecuta . No es posible no ver los archivos debido a los permisos en este caso.
Ярослав Рахматуллин
@ ЯрославРахматуллин rsync también se puede ejecutar en modo demonio. O se puede programar como cronjob. De cualquier manera, es posible que el usuario bajo el cual se ejecuta rsync no sea el usuario que quiere ver el archivo temporal. En ese caso, es posible que sea un problema de permiso.
Simon
1
El archivo temporal puede comenzar con ".". En este caso, es .foo.bar.hzmkjt7.
interskh