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 --exclude
o --delete-excluded
solo 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_files
rsync 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_1
ydir_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_1
ydir_2
, nodir_3
Respuestas:
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 defind
y la ejecución deunison
orsync
.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:
o con zsh:
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_PRELOAD
para anularreaddir
(o un equivalente de Windows) cuando ejecuta rsync o unison, para que solo devuelva archivos de su propiedad.fuente