¿Es mejor copiar y eliminar siempre, en lugar de mover?

18

En términos generales, me encuentro en pánico cuando me doy cuenta de que si cancelo un movimiento de archivo, podría causar que el destino o la fuente estén incompletos. Esta pregunta se aplica a plataformas basadas en Windows y Unix. Nunca puedo recordar exactamente cómo funciona el comando mover en ninguno de los casos. Por ejemplo, si está moviendo un directorio; ¿copia todo el directorio y luego lo elimina, o copia y luego elimina cada archivo individualmente?

Siempre me doy cuenta, después de escribir algo como mv verybigdir dest, que tal vez debería haber escrito cp -R verybigdir dest  &&  rm -R verybigdir(donde el &&operador pasa al siguiente comando solo si el primero fue exitoso), ¿o no tiene sentido? ¿Qué sucede exactamente cuando presiono Ctrl+ a Cmitad de un movimiento? Del mismo modo, ¿qué sucede exactamente en Windows cuando presiono el botón cancelar?

No puedo contar la cantidad de veces que moví algo (la última vez que lo usé svn) y tuve dos directorios, con contenido dividido. Supongo que la respuesta es difícil, porque no todas las aplicaciones mueven grupos de archivos de la misma manera.

Nick Bolton
fuente
16
Hagas lo que hagas, simplemente no lo elimines primero.
mtone
@monotone Hilarante +1
Nick Bolton

Respuestas:

10

En Windows, moverse a la misma unidad y partición actuará como el comando mv de Unix y cambiará el nombre de la carpeta o cambiará su padre. Sin embargo, si tuviera que moverlo a otro controlador o partición, copiaría y eliminaría archivo por archivo, por lo tanto, es más eficiente usar un archivo tar o un archivo zip sin compresión para mover archivos más rápido a través de particiones y discos duros . Si tuviera que cancelarlo, simplemente se detendría donde está. Creo que lo mismo es cierto para Unix, pero no experimenté lo suficiente para estar 100% seguro. Es solo una cuestión de cambiar el inodo, pero si está en otra partición o unidad, entonces debe copiarse a sectores en esa partición o unidad. Si tuviera que cancelarlo durante la transferencia, ya habría movido algunos archivos, y el archivo que se estaba transfiriendo lo verá '

Actualización: si cancela un movimiento y desea reanudarlo, simplemente vuelva a emitir la orden de movimiento. Puede advertirle que la carpeta de destino ya existe, pero los archivos no se sobrescribirán (a menos que existieran antes del movimiento original o se hayan agregado entre las dos órdenes de movimiento) ya que tan pronto como se transfieren, se eliminan del fuente (si está en una partición o unidad diferente).

Lobo
fuente
Ah, no había pensado en la compresión.
Nick Bolton el
Realmente no necesita comprimir, lo que puede requerir mucho tiempo. A veces, un nivel de compresión de 0 (almacenamiento) puede hacer el trabajo de mover carpetas grandes a través de unidades mucho más rápido.
Wolf
"En Windows, moverse a la misma unidad y partición actuará como el comando mv de Unix y cambiará el nombre de la carpeta o cambiará su padre". - Cuando se usa el Explorador de Windows, eso no es cierto. Hace mucha basura, lleva años, y puede terminar con contenido dividido en dos directorios, vea esta respuesta a una pregunta mía .
maaartinus
@maaartinus En realidad, la forma en que funciona el Explorador de Windows es cavando recursivamente en las carpetas en lugar de cambiar el nodo principal. Sin embargo, tiene razón para el Explorador de Windows, no es solo un movimiento atómico. Supuse que se estaba usando la línea de comando, debería haber preguntado.
Wolf
11

Incluso en una computadora perfectamente estable que nunca falla: si te importan las marcas de tiempo, entonces mves mejor que simple cp.

( cp -aconservará las marcas de tiempo para usted, y supongo que existe algo similar en Windows).

Arjan
fuente
1
Ajá, marcas de tiempo. ¡No lo había considerado! +1
Nick Bolton el
Honestamente, las marcas de tiempo son importantes ...
Marcin
1
@Marcin, que están ahí por una razón, si eso es lo que preguntas ...
Macek
10

No.

Explicación:

mv verybigdir dest

cambia el nombre de verybigdir a dest. Esta es una operación atómica, es decir, no puede fallar a la mitad.

Si dest está en otro dispositivo, mv copiará primero y luego eliminará la versión anterior. Esta no es una operación atómica. Si falla, es posible que solo tenga una copia parcial de verybigdir en dest, pero verybigdir aún estará completo.

Sí, otras aplicaciones pueden mover archivos de manera diferente.

Timo Stamm
fuente
2
En realidad, creo que mv en Linux copia / elimina cada archivo o directorio individualmente, en lugar de copiar todo el árbol en el destino y luego eliminar todo el árbol de la fuente ... así que si cancelas a la mitad, terminarás con algunos archivos en ambos lugares, y ninguno de los directorios estará completo.
robar el
3
@rob: No. Los directorios son archivos como cualquier otro, y se tratan de la misma manera. El comportamiento del que estás hablando se logra con mv verybigdir/* dest.
dmckee
2
Básicamente, mv maneja cada argumento de una manera "cp && rm" ... mv verybigdir/* destdivide el mv de verybigdir en muchas operaciones de movimiento separadas. Recuerde siempre que, a diferencia de Windows, un programa / herramienta de Linux no puede ver que "*" allí, se expande por el shell.
Jürgen A. Erhard
4

En Windows siempre copio y borro en lugar de mover. Una vez estaba moviendo archivos y aquí es donde noté por primera vez una mala memoria. Al mover el archivo, se detuvo en el medio y recibí un error, así que verifiqué la carpeta de origen y el archivo desapareció, luego verifiqué el destino y había un archivo dañado. Esto sucedió con mayor frecuencia con archivos de mayor tamaño y la mayoría de ellos fueron descargas que tomaron horas, por lo que recomendaría copiar y luego eliminar. Ahorre tiempo al principio, valdrá la pena al final.

a.
fuente
3

En Unix, en movimientos que no cruzan los límites del sistema de archivos, mvno copia los datos: solo actualiza la base de datos de inodo en varios directorios. Esto es mucho más rápido que cpen archivos grandes.

Además, el uso a mvtravés de los límites del sistema de archivos invoca silenciosamente un mecanismo de copia y eliminación.

Así que creo que deberías preferirlo mv.

dmckee
fuente
Muy bien resumido.
Nick Bolton el
"un mecanismo de copia y eliminación" podría interpretarse como "copiar cada archivo, luego eliminarlo" o "copiar todos los archivos, luego eliminarlos todos".
j_random_hacker
2

En Windows, al menos, mover es simplemente una Copia y Eliminar más automatizada. Creo que mv mueve cada archivo individualmente, lo que significa que ^ c-ing no perderá ningún archivo, simplemente terminará con sus archivos divididos en dos lugares, a diferencia del Explorador de Windows, que eliminará todo cuando se cancele.

Mi solución a esto es: nunca mueva a menos que esté seguro de querer moverlo.

Phoshi
fuente
1

Si está utilizando ACL en el sistema de archivos de origen, pero no en el destino, mv en Linux copiará el origen y luego, debido a la incapacidad de establecer las ACL en el destino, se detendrá. Entonces terminas teniendo el archivo en ambos lados. No hay ningún interruptor en mv para evitar ese comportamiento, por lo que en este caso es preferible cp && rm.

uli42
fuente