mv
y rsync
no son programas similares. En particular, mv
a menudo intenta simplemente cambiar el nombre de los objetos. Si está en el mismo sistema de archivos, no copia el contenido en absoluto.
Si aún no tenías imperative_PLs/fortran
, luego mv
tomaría el fortran
existente directorio y cámbiele el nombre a ese punto en el árbol.
Pero ya tiene un directorio (con contenidos) en esa ubicación. Debido a que un nombre solo puede hacer referencia a un solo objeto, el directorio existente debería eliminarse o cambiarse de nombre. mv
asume que no desea hacer ninguna de las dos y aborta.
rsync
en su lugar, copia los archivos individuales y otros contenidos dentro de fortran
y los coloca en el imperative_PLs/fortran
existente directorio.
Piense en ello como rename
en cambio, y el comportamiento puede parecer más comprensible.
mv
es en realidad rename
debajo de la cubierta.
Si mueve un archivo a otro archivo, mv
asume que sabe lo que está haciendo y sobrescribe el archivo de destino.
Si mueve un directorio a otro directorio, mv
asume que desea mantener el nombre base de su directorio original y crearlo en el directorio de destino. Si todavía no hay un directorio con ese nombre en el lado de destino, o si existe un directorio con ese nombre pero está vacío, la operación se realiza correctamente.
Sin embargo, si el directorio de destino ya existe y no está vacío, ya no es un rename
pero eso debería ser una eliminación recursiva de archivos y directorios. rename
no está diseñado para hacerlo, por lo que falla, mv
no va más allá ya que asume que no querías hacerlo y también falla.
-
mv
no funciona en este caso porque no ha sido diseñado para hacerlo. Las llamadas al sistema son (probablemente)- Mover al mismo sistema de archivos:
rename
(originalmentelink
yunlink
) - Moverse entre sistemas de archivos:copia recursiva del archivo seguida de
unlink
recursivo
- Mover al mismo sistema de archivos:
-
Opinión:Creo que no es tanto que haya sido diseñado no para trabajar, ya que no fue diseñado para manejar este caso de uso. Para una herramienta "simple" que pretende hacer una cosa bien, debe proporcionar un conjunto de interruptores para indicar a
mv
cuál de estos caminos de acción tomar:- Para rescatar con un error, como en la implementación actual
- Para fusionar, saltando con un error si ya existe un archivo
- Para fusionar, reemplazando cualquier archivo de destino que ya exista
Si la acción de fusionar/reemplazar es lo que desea, puede implementarla fácilmente con cp
seguido de rm
, o usando una de las utilidades de copia de árbol de archivos tar
, pax
, etc.