Question Est-ce que mv avec le joker est encore atomique


Je crois comprendre que mv dir1 / file1 dir2 / est atomique,

Mv dir1 / * dir2 / est-il aussi atomique?

A titre d'exemple, supposons qu'il y a 10 fichiers dans dir1 qui font chacun 10 Go.


6
2018-03-17 19:22


origine


Tant qu'il s'agit d'un déplacement au sein d'un système de fichiers, la taille des fichiers à déplacer doit être sans importance (seuls les fichiers de répertoire concernés sont modifiés). - Marc van Leeuwen


Réponses:


Commençons par l'affirmation que mv n'est pas toujours atomique.

Pour tout fichier individuel, le déplacement ou le changement de nom effectué par mv est atomique à condition que le fichier soit déplacé dans le même système de fichiers. L'atomicité ne garantit pas que le fichier ne se trouve qu'à un endroit ou à un autre; il est tout à fait possible que le fichier soit présent dans le système de fichiers des deux endroits simultanément pendant "peu de temps".

mv est très certainement pas atomique lorsque le déplacement qu'il effectue s'effectue d'un système de fichiers à un autre, ou lorsqu'un système de fichiers distant ne peut pas implémenter mv opération localement. Dans ces cas mv est mis en œuvre par l'équivalent d'un cp suivi par rm.

Passons maintenant à la question de l'atomicité dans plusieurs fichiers. mv est au mieux atomique que par fichier, donc si vous avez plusieurs fichiers à déplacer ensemble, l’implémentation est telle qu’ils seront déplacés un à un.

Si vous avez réellement besoin qu'un groupe de fichiers apparaisse simultanément dans une destination, envisagez de le placer dans un répertoire et de le déplacer. Cet objet unique (le répertoire) peut être déplacé de manière atomique.


20
2018-03-17 20:00



«L'atomicité ne garantit pas que le fichier ne se trouve qu'à un endroit ou à un autre; il est tout à fait possible que le fichier soit présent dans le système de fichiers des deux endroits simultanément pendant "peu de temps". ' - Alors quoi Est-ce que la garantie atomicité? Cela ne semble pas du tout atomique. - John Kugelman
@JohnKugelman atomicity garantit que le fichier n'est pas partiellement à un endroit ou à un autre; il est complet ou n'existe pas dans le système de fichiers. Voir POSIX mv et POSIX renommer pour le détail précis - roaima
En ce qui concerne les fichiers uniques, 1) Linux garantit (man 2 rename) que, si renommer remplace un fichier existant, "il n’ya aucun moment où un autre processus essayant d’accéder à newpath le trouvera manquant". 2) POSIX mentionne atomicité uniquement dans la section "informative" "Justification" - et non de manière non ambiguë. Je n'ai rien trouvé d'autre concernant l'atomicité de renommer (2). - Zrin
@Zrin renommer (2) n'est qu'une partie de mv. La question concerne mv c'est ce que j'ai abordé. Vous avez raison de dire qu'un appel à rename (2) qui remplace un fichier existant garantira que le nom de fichier cible ne manque jamais, mais je ne suis pas sûr que cela soit pertinent pour la question posée. - roaima
@roaima Mon point est que rename (2) est la seule partie de mv qui est (partiellement) atomique ... - Zrin


Non. mv dir1/* est le même que mv dir1/file1 && mv dir1/file2 && mv dir1/fileN. Chaque mouvement individuel est atomique, mais pas l’ensemble complet.


6
2018-03-17 19:25



L'explication n'est pas correcte, mais la conclusion que chaque mouvement individuel est atomique l'est. La commande est la même que mv dir1/file1 dir1/file2 dir1/file3..... - Thorbjørn Ravn Andersen
Ne fait pas && signifie que la première commande doit réussir pour que la deuxième commande ait lieu? Donc, cela voudrait dire que si le premier mv échoue, ça s'arrêterait. je pense mv continue d'essayer de déplacer des fichiers. - Willem Van Onsem
@ ThorbjørnRavnAndersen la prémisse sous-jacente que mv est atomique n’est pas nécessairement vrai, et donc la conclusion n’est pas toujours vraie. - roaima
@roaima S'il vous plaît n'hésitez pas à élaborer. Peut-être même écrire une meilleure réponse. - Thorbjørn Ravn Andersen
@ ThorbjørnRavnAndersen j'ai déjà fait ainsi. - roaima


Dans un autre cas, un nouveau fichier est ajouté à dir1 après le démarrage du mv.

Comme le "*" est développé par le shell, mv ne saura même pas ce nouveau fichier.


1
2018-03-18 11:03