¿Movimiento atómico aproximado a través de los sistemas de archivos?

16

Tengo que mover algunos archivos de un sistema de archivos a otro en Ubuntu. Sin embargo, es muy importante que los archivos nunca existan como archivos parciales o incompletos en el destino, al menos no con el nombre de archivo correcto.

Hasta ahora, mi única solución es escribir un script que tome cada archivo, lo copie en un nombre temporal en el destino, luego cambie el nombre (que creo que debería ser atómico) en el destino al nombre de archivo original y finalmente elimine el archivo de origen .

Sin embargo, escribir y depurar un script parece que es excesivo para esta tarea. ¿Hay alguna forma o herramienta que ya lo haga de forma nativa?

Niels2000
fuente
8
Siento un problema xy. ¿Por qué necesitas esto?
gallina - reinstalar a Mónica el
3
@henning Hay muchas razones posibles, así que esta es una buena pregunta. Por ejemplo, un programa que intenta automáticamente procesar archivos con un nombre de archivo que coincida con una expresión regular determinada (pero no puede deshabilitarse temporalmente por razones burocráticas). O tal vez un sistema de respaldo que toma archivos y los almacena en medios duraderos pero de solo escritura.
wizzwizz4
1
@henning Lo necesito porque tengo una cantidad de cachés que leen de varios almacenes diferentes, pero uno está llegando a su capacidad y necesita ser eliminado del servicio. En consecuencia, es necesario que cada archivo, si existe en alguna de las ubicaciones, debe estar completo e intacto. De lo contrario, existe una condición de carrera entre una transferencia que comienza y finaliza donde un caché podría tomar (y retener) un archivo incompleto.
Niels2000

Respuestas:

27

rsynccopias a nombres de archivos temporales (p. ej., vea la extensión de archivo temporal de Rsync y rsync, ¿crea un archivo temporal durante la transferencia? ) a menos que use la --inplaceopción. Solo les cambia el nombre después de que el archivo se haya transferido correctamente. rsynctambién elimina los archivos de destino que solo se transfirieron parcialmente (por ejemplo, debido a un disco lleno u otro error).

También hay una --remove-source-filesopción que elimina los archivos de origen después de que se hayan transferido correctamente. Vea la rsyncpágina del manual para más detalles.

Poniendo todo junto, podría usar algo como:

rsync -ax --remove-source-files source/ target/

Esta opción es particularmente útil para tareas como mover archivos de una cola "entrante" o similar al directorio donde serán procesados.

Alternativamente, si este es un espejo de una sola vez, tal vez solo use rsyncsin la --remove-source-filesopción. Puede eliminar los archivos de origen más adelante si lo desea / necesita.

cas
fuente
Pensé que habría una buena herramienta para el trabajo. ¡Gracias!
Niels2000
@ Niels2000 No recuerdo si alguna vez he usado esa opción rsync antes, pero lo que quería sonaba como el tipo de cosa que rsyncpodía hacer, y sabía que transfería archivos con un nombre temporal (a menos que lo use --inplace), así que busqué en man rsyncy encontrado --remove-source-files. rsynces una buena herramienta para verificar primero casi cualquier tarea de transferencia de archivos.
cas