Si uso mv
para mover una carpeta llamada "carpeta" a un directorio que ya contiene "carpeta", ¿se fusionarán o se reemplazarán?
Respuesta aceptada:
mv
no puede fusionar o sobrescribir directorios, fallará con el mensaje "mv:no se puede mover 'a' a 'b':el directorio no está vacío" , incluso cuando estás usando --force
opción.
Puede solucionar esto usando otras herramientas (como rsync
, find
, o incluso cp
), pero debe considerar cuidadosamente las implicaciones:
rsync
puede fusionar el contenido de un directorio en otro (idealmente con--remove-source-files
opción para eliminar de forma segura solo los archivos de origen que se transfirieron correctamente y con la opción habitual de permiso/propiedad/preservación del tiempo-a
si lo desea)
… pero esta es una operación de copia completa y, por lo tanto, puede hacer un uso intensivo del disco.- Opción preferida actualmente: Puedes combinar
rsync
's--link-dest=DIR
opción (para crear enlaces duros en lugar de copiar el contenido del archivo, cuando sea posible) y--remove-source-files
para obtener una semántica muy similar a unmv
regular .
Para esto,--link-dest
se le debe dar una ruta absoluta a la fuente directorio (o una ruta relativa desde el destino a la fuente ).
… pero esto está usando--link-dest
de forma no intencionada (que puede o no causar complicaciones), requiere conocer (o determinar) la ruta absoluta a la fuente (como argumento para--link-dest
), y nuevamente deja una estructura de directorios vacía para limpiar según . - Puedes usar
find
para recrear secuencialmente la estructura del directorio de origen en el destino, luego mover individualmente los archivos reales
... pero esto tiene que repetirse a través de la fuente varias veces y puede encontrar condiciones de carrera (se crean nuevos directorios en la fuente durante el proceso de varios pasos) cp
puede crear enlaces duros (en pocas palabras, punteros adicionales al mismo archivo existente), lo que crea un resultado muy similar a la combinación demv
(y es muy eficiente en E/S ya que solo se crean punteros y no es necesario copiar datos reales)
… pero esto nuevamente sufre de una posible condición de carrera (los archivos nuevos en la fuente se eliminan a pesar de que no se copiaron en el paso anterior)
Cuál de estas soluciones alternativas (si las hay) es adecuada dependerá en gran medida de su caso de uso específico.
Como siempre, piense antes de ejecutar cualquiera de estos comandos y tenga copias de seguridad.
1:tenga en cuenta que rsync --remove-source-files
no eliminará ningún directorio, por lo que tendrá que hacer algo como find -depth -type d -empty -delete
después para deshacerse del árbol de directorios de origen vacío.