Respuestas:
Si mueve un directorio en el mismo sistema de archivos, solo mueve la entrada del directorio de una ubicación en el sistema de archivos a otra. Por ejemplo, mv /source/dir /target/dir
eliminará la entrada de directorio de dir
from /source
y creará una nueva en /target
. Eso se hace mediante una llamada al sistema atómico (es decir, ininterrumpible). El inodo que contiene las entradas del directorio dir
y el contenido real del directorio en sí no se ve afectado.
Si mueve el directorio de un sistema de archivos a otro, todos los archivos se copian primero al nuevo sistema de archivos y luego se desvinculan del original. Entonces, si interrumpe mv
mientras se está copiando, puede terminar con dos copias de algunos de los archivos, en la ubicación anterior y en la nueva.
strace mv /fs1/dir /fs2/
: lo último que hace mv es invocar unlinkat
todos los archivos de origen a la vez (no uno por uno a medida que se copian).
La implementación de GNU itera sobre los argumentos en la línea de comando, intenta cambiar el nombre primero y, si eso falla, copia recursivamente y luego borra recursivamente la fuente. Entonces
mv a b c/
eliminará a antes de copiar b , y no comenzará a eliminar nada en a antes de que se complete la copia de destino.
Tenga en cuenta que esto solo se aplica a la implementación de GNU.
Para aclarar: si una es un directorio que contiene D y E , y B es un archivo, el orden será
mv
, por lo que no es solo GNU.
Mueve un directorio, interrumpe el movimiento y el directorio original permanecerá intacto:
$ mv a b/
Si mueve varios directorios, cada uno estará intacto en el origen o en el destino, dependiendo de cuándo interrumpió:
$ mv a b c/
Cómo obtuve mi respuesta:
$ mv --version
mv (GNU coreutils) 8.21
$ info mv
... It first uses some of the same code that's used by `cp -a'
to copy the requested directories and files, then (assuming the copy
succeeded) it removes the originals. If the copy fails, then the part
that was copied to the destination partition is removed. If you were
to copy three directories from one partition to another and the copy of
the first directory succeeded, but the second didn't, the first would
be left on the destination partition and the second and third would be
left on the original partition.
Como prueba, copié una carpeta grande en un directorio NFS, la interrumpí y el número de archivos en mi carpeta grande fuente permaneció igual, y el contenido parcial se dejó en el directorio NFS. Usé "find. -Type f | wc -l" para verificar.
Parece que la respuesta de Simon es correcta.
La respuesta aceptada es definitivamente errónea sobre moverse entre sistemas de archivos, un hecho que ya me ahorró muchos problemas un par de veces. Al mover un directorio que contiene subdirectorios, no se eliminará ningún archivo en un subdirectorio antes de que se haya copiado todo el subdirectorio. Esto es, por cierto, el significado real de "objeto por objeto": un subdirectorio ES un objeto (archivo) y, por lo tanto, su integridad debe ser preservada por una copia completa en el destino antes de que se pueda eliminar algo. Entonces la respuesta de Simon me parece la correcta.
No. mv opera objeto por objeto, por lo que los objetos que ya han sido procesados se eliminarán de la fuente.
Definitivamente no. El movimiento se realiza objeto por objeto. Por lo tanto, el objeto movido al destino hasta el punto de interrupción ya no existirá en la fuente.
Si se emitió mv para un archivo grande (entre diferentes) y se ha interrumpido, la fuente estará intacta. En el objetivo verá un archivo incompleto hasta el punto de interrupción.
Sin embargo, puede restaurar el mv con el mismo comando y el proceso continuará.
Si desea interrumpir mv porque desea desconectarse del terminal, puede enviarlo a un segundo plano:
* press Ctrl+Z
# bg
# disown
fsck
(que probablemente se ejecutará automáticamente al reiniciar, ya que el disco no se desmontó limpiamente).