Hace mv
actuar como cp(1)
si se denegó el permiso para que el proceso se mudara?
Si es así, ¿no va en contra de la regla hacer una cosa y hacerlo bien?
Respuesta aceptada:
La respuesta corta es que no.
mv
se define como:
realizar acciones equivalentes a rename()
función
rename()
no copia el contenido, simplemente le cambia el nombre en el disco. Es una operación completamente atómica que nunca falla parcialmente completa.
Sin embargo, eso no cuenta toda la historia. Donde este efecto puede Sucede cuando se intenta mover un archivo entre dispositivos:en ese caso, no es posible cambiar el nombre en el sistema de archivos. Para tener el efecto de mover, mv
primero copia la fuente al destino y luego elimina la fuente. En efecto, mv /mnt/a/X /mnt/b/Y
es esencialmente equivalente a cp /mnt/a/X /mnt/b/Y && rm /mnt/a/X
. Esa es la única forma en que podría funcionar mover archivos entre dispositivos.
Cuando mv
no tiene permiso para eliminar ese archivo de origen, se informará un error, pero en ese momento ya se ha producido la copia. No es posible evitarlo verificando los permisos con anticipación debido a las posibles condiciones de carrera donde los permisos cambian durante la operación.
Realmente no hay forma de prevenir esta posible eventualidad, aparte de hacer que sea imposible mover archivos entre dispositivos. La opción de permitir mv
entre cualquier origen y destino simplifica las cosas en el caso general, a expensas de un comportamiento extraño (pero no destructivo) en estos casos inusuales.
Esta es también la razón por la cual mover un archivo grande dentro de un solo dispositivo es mucho más rápido que moverlo a otro.