rsync: evita eliminar archivos que no pertenecen a un determinado usuario

1

Estoy usando rsync para mantener sincronizada una gran carpeta de documentos compartidos con mi computadora portátil. Más específicamente, estoy transfiriendo de mi computadora portátil al repositorio compartido. Lo que me gustaría hacer es sincronizar solo aquellos archivos que han sido creados / modificados por mi usuario. Al ser un repositorio compartido, otras personas podrían haber creado otros directorios o archivos.

He examinado las diferentes opciones de rsync pero no he encontrado lo que estoy buscando. Puedo --excludeo --delete-excludedsolo dar patrones para que coincidan con el nombre del archivo, no con otros metadatos (¿o puedo?).

Una solución alternativa, pero algo engorrosa, podría ser lanzar un script remoto como find -not -perm $USER > excluded_filesrsync excluyéndolos, pero prefiero no hacerlo.

¿Algunas ideas?

actualización: para aclarar, los datos en mi computadora portátil serán solo una parte de los datos en el servidor. Aquí hay un ejemplo

  • mi laptop contiene dir_1ydir_2
  • Los sincronizo con el servidor; ahora el servidor contiene dos directorios
  • otro usuario inicia sesión en el servidor y crea un nuevo directorio dir_3
  • Me equivoco con mis archivos, ahora rsync nuevamente pero necesito usar --delete
  • Quiero --delete sólo los archivos que he creado en el primer lugar, es decir, aquellos con dir_1y dir_2, no dir_3
lorenzog
fuente
¿Otras personas podrían haber creado archivos dentro de sus carpetas? ¿Por qué no creas una carpeta llamada lorenzog en la que nadie más escribe?
user39559
@lorenzog: Su flujo de trabajo parece extraño: según tengo entendido, tiene archivos en su computadora portátil que no le pertenecen, y desea copiar solo los archivos que le pertenecen en el repositorio compartido. ¿Es esto correcto? ¿Alguna vez ha copiado archivos en la otra dirección?
Gilles
Debería explicar mejor la situación. Ver edición
lorenzog
¿Y los otros usuarios no crearán archivos dentro de dir_1 y dir_2?
user39559
@ user39559, sí, podrían hacerlo, y es por eso que esperaba que rsync pudiera localizar esos archivos y evitar que los borre.
lorenzog

Respuestas:

1

Supongo que mantener una copia de todos los archivos en su computadora portátil no es una opción. De lo contrario, sería mucho más fácil.

La herramienta correcta aquí es una herramienta de control de versiones. Pero me doy cuenta de que a menos que todos los usuarios tengan una cantidad mínima de sofisticación técnica, hacer que usen herramientas de control de versiones no es una sugerencia realista. E incluso entonces, tendría que elegir cuidadosamente lo que verifica en su computadora portátil.

Usted todavía puede usar el control de versiones. En la máquina compartida, verifique todos sus archivos y deje en paz los archivos de otras personas. Mantenga un pago por separado en su computadora portátil. Comprometerse y verificar cada vez que cambie de máquina. Cuanto más lo pienso, más me gusta esta opción: no requiere ninguna codificación ni siquiera ningún script frágil.


Haces sincronización bidireccional. Rsync no es bueno para esto: si olvida ejecutarlo o lo ejecuta accidentalmente en la dirección incorrecta, es probable que pierda el trabajo sin previo aviso. Unison es una buena herramienta para la sincronización bidireccional: siempre se sincroniza bidireccionalmente y se queja si un archivo ha cambiado en ambos lados. Es de código abierto y está bien integrado en las plataformas de Unix y Windows.

Desafortunadamente, unison no tiene una opción para ignorar archivos por propietario, como tampoco lo hace rsync. Puede generar una lista de ignorados con find -user, pero se vuelve desordenada y existe una condición de carrera si alguien más agrega o elimina archivos entre la ejecución de findy la ejecución de unisono rsync.

Puede parchear rsync o unison para agregar la opción de ignorar archivos en función de sus metadatos. Acabo de echar un vistazo rápido a la fuente, y en ambos casos el código de exclusión está fuertemente vinculado a las cadenas, no a las entradas del directorio. Parece factible, pero no es un parche trivial.


Puede crear una vista del sistema de archivos que contenga solo sus archivos. No tengo una solución completa y perfecta, pero aquí hay un par de ideas para comenzar.

  • Si la máquina compartida admite enlaces duros (todos los unices lo hacen, y Windows lo hace desde NT4 siempre que use NTFS), es bastante fácil crear una copia del repositorio que contenga solo enlaces duros de sus archivos:

    cd /shared/repository
    find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" &&
                                  ln "$0" "/my/view/$0"' {} \;
    

    o con zsh:

    autoload zmv
    zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
    

    Debería tener cuidado de no romper los enlaces duros al editar o sincronizar. No sé cómo rsync y al unísono podrían hacer frente. Después de la creación inicial, se eliminará un archivo en el repositorio compartido que sea de su propiedad y que tenga un recuento de enlaces de 1, y un archivo en su vista con un recuento de enlaces de 1 se vinculará en el repositorio compartido. Todo esto es bastante torpe, y agradecería cualquier sugerencia de mejora.

  • Si la máquina compartida admite FUSE , puede usarla para crear una vista en vivo del repositorio compartido que contiene solo sus archivos. No conozco ningún sistema de archivos FUSE existente que pueda hacerlo, pero bindfs se acerca (no he mirado el código para evaluar la dificultad de codificación).

  • Puede usar LD_PRELOADpara anular readdir(o un equivalente de Windows) cuando ejecuta rsync o unison, para que solo devuelva archivos de su propiedad.

Gilles
fuente
Brillante. Gracias por el enlace, no sabía de su existencia. El control de versiones ya no era una opción una vez que comenzamos a cargar objetos grandes (películas de 2 gb, varios documentos de Microsoft Office con imágenes grandes en ellos, etc.).
lorenzog
Unison funcionará si puede enseñarle a ignorar los archivos que pertenecen a otras personas. A menos que lorenzog quiera reflejar los archivos de otras personas en su computadora portátil y se olvidó de especificar eso en la pregunta. Si este es el caso de que lorenzog también quiere reflejar los archivos de otras personas en su computadora portátil, entonces no requiere nada de los otros usuarios. Ni siquiera necesitan saber que lo está actualizando con una herramienta de sincronización.
user39559
@ user39559: Doh, tienes razón. Mantengo mi recomendación de usar el unísono para la sincronización bidireccional en general, pero en realidad no resuelve el problema de lorenzog. Unison solo admite ignorar archivos por nombre. Déjame pensarlo un poco más ...
Gilles
Buena solución! Pero si se realiza algún cambio en el inodo cuando crea enlaces duros, Unison probablemente escaneará todo nuevamente y tomará horas en lugar de segundos, poniendo una carga pesada en el servidor. Honestamente, esta es una configuración demasiado incómoda en la que alguien quiere compartir carpetas tan íntimamente con otras personas pero solo refleja sus propios archivos.
user39559