GNU/Linux >> Tutoriales Linux >  >> Linux

¿Fusionar carpetas con Mv?

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 un mv 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 de mv (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.

Relacionado:¿Cómo descargar carpetas de más de 20 GB en Dropbox sin una cuenta Pro?

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.


Linux
  1. Ejecutar secuencia de comandos con ". ¿Y con “fuente”?

  2. ¿Archivos Cat con directorio?

  3. ¿Fusionar 3 líneas consecutivas con intercambio?

  4. ¿Conservar la fecha de modificación en los directorios/carpetas con Rsync?

  5. ¿Usando –exclude con el comando Du?

Mapas mentales de código abierto con Draw.io

Crear un SDN en Linux con código abierto

Comando fuente de Linux con ejemplos

Comando de CD de Linux con ejemplos

Cómo conectarse con Samba a Linux Active Directory

Problemas con la fusión de cuentas de cPanel