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:
rsyncpuede fusionar el contenido de un directorio en otro (idealmente con--remove-source-filesopció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-asi 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=DIRopción (para crear enlaces duros en lugar de copiar el contenido del archivo, cuando sea posible) y--remove-source-filespara obtener una semántica muy similar a unmvregular .
Para esto,--link-destse 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-destde 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
findpara 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) cppuede 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.