Approximation du mouvement atomique à travers les systèmes de fichiers?

16

Je dois déplacer certains fichiers d'un système de fichiers à un autre sous Ubuntu. Cependant, il est très important que les fichiers n'existent jamais en tant que fichiers partiels ou incomplets à la destination, du moins pas sous le nom de fichier correct.

Jusqu'à présent, ma seule solution consiste à écrire un script qui prend chaque fichier, le copie dans un nom temporaire à la destination, puis le renomme (qui, je pense, devrait être atomique) à la destination avec le nom de fichier d'origine et supprime enfin le fichier d'origine .

Cependant, l'écriture et le débogage d'un script semblent exagérés pour cette tâche. Existe-t-il un moyen ou un outil qui le fait déjà nativement?

Niels2000
la source
8
Je sens un problème xy. Pourquoi en avez-vous besoin?
henning - réintègre Monica
3
@henning Il existe de nombreuses raisons possibles, c'est donc une bonne question. Par exemple, un programme qui tente automatiquement de traiter des fichiers avec un nom de fichier correspondant à une certaine expression régulière (mais ne peut pas être temporairement désactivé pour des raisons bureaucratiques). Ou peut-être un système de sauvegarde qui prend les fichiers et les stocke ensuite sur des supports durables mais en écriture seule.
wizzwizz4
1
@henning J'en ai besoin car j'ai un certain nombre de caches qui lisent à partir de plusieurs stockages différents, mais l'un approche de la capacité et doit être retiré du service. Par conséquent, il est nécessaire que chaque fichier, s'il existe dans l'un des emplacements, soit complet et intact. Sinon, il existe une condition de concurrence entre le début et la fin d'un transfert où un cache peut récupérer (et conserver) un fichier incomplet.
Niels2000

Réponses:

27

rsyncdes copies dans des noms de fichiers temporaires (par exemple, voir l' extension de fichier temporaire Rsync et rsync - crée-t-il un fichier temporaire pendant le transfert? ) sauf si vous utilisez l' --inplaceoption. Il les renomme uniquement après que le fichier a été transféré avec succès. rsyncsupprime également tous les fichiers de destination qui n'ont été que partiellement transférés (par exemple en raison d'un disque plein ou d'une autre erreur).

Il existe également une --remove-source-filesoption qui supprime les fichiers source après leur transfert réussi. Voir la rsyncpage de manuel pour plus de détails.

En mettant tout cela ensemble, vous pouvez utiliser quelque chose comme:

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

Cette option est particulièrement utile pour des tâches telles que le déplacement de fichiers hors d'une file d'attente "entrante" ou similaire au répertoire dans lequel ils seront traités.

Alternativement, s'il s'agit d'un miroir unique, peut-être simplement l'utiliser rsyncsans l' --remove-source-filesoption. Vous pouvez supprimer les fichiers source ultérieurement si vous le souhaitez / devez le faire.

cas
la source
Je pensais qu'il y aurait un bon outil pour le travail. Merci!
Niels2000
@ Niels2000 Je ne me souviens pas si j'ai déjà utilisé cette option rsync mais ce que vous vouliez ressemblait au genre de chose qui rsyncpourrait faire, et je savais que cela transférait des fichiers avec un nom temporaire (sauf si vous utilisez --inplace), alors j'ai regardé dans man rsyncet trouvé --remove-source-files. rsyncest un bon outil pour vérifier d'abord presque toutes les tâches de transfert de fichiers.
cas