
Estoy usando rsync para mantener sincronizada una gran carpeta de documentos compartidos con mi computadora portátil. Más específicamente, estoy sincronizando DESDE 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, es posible que otras personas hayan creado otros directorios o archivos.
He examinado las distintas opciones de rsync pero no he encontrado lo que estoy buscando. Puedo --exclude
o --delete-excluded
solo dar patrones que coincidan con el nombre del archivo, no ningún otro metadato (¿o puedo?).
Una solución alternativa, pero algo engorrosa, podría ser iniciar un script remoto como find -not -perm $USER > excluded_files
y rsync excluyéndolos, pero prefiero no hacerlo.
¿Algunas ideas?
Actualización: para aclarar, los datos de mi computadora portátil serán solo una parte de los datos del servidor. Aquí hay un ejemplo
- mi computadora portátil 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 volveré a sincronizar pero necesito usar --delete
- Quiero eliminar SÓLO los archivos que creé en primer lugar, es decir, los de
dir_1
ydir_2
,nodir_3
Respuesta1
Supongo que guardar 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 adecuada aquí es una herramienta de control de versiones. Pero me doy cuenta de que, a menos que todos los usuarios tengan un mínimo de sofisticación técnica, lograr que utilicen herramientas de control de versiones no es una sugerencia realista. E incluso entonces tendrías que elegir cuidadosamente lo que miras en tu computadora portátil.
TúEs posible que aún utilice el control de versiones. En la máquina compartida, registre todos sus archivos y deje los archivos de otras personas en paz. Mantenga una caja separada en su computadora portátil. Comprométete y comprueba cada vez que cambies de máquina. Cuanto más lo pienso, más me gusta esta opción: no requiere ninguna codificación ni siquiera secuencias de comandos frágiles.
Haces sincronización bidireccional. Rsync no es bueno en esto: si olvida ejecutarlo o accidentalmente lo ejecuta en la dirección incorrecta, es probable que pierda el trabajo sin previo aviso.Unísonoes una buena herramienta para la sincronización bidireccional: siempre sincroniza bidireccionalmente y se queja si un archivo ha cambiado en ambos lados. Es de código abierto y está bien integrado en plataformas Unix y Windows.
Desafortunadamente, unison no tiene una opción para ignorar archivos por propietario, al igual que rsync. Puede generar una lista de ignorados con find -user
, pero se vuelve confusa y hay una condición de carrera si alguien más agrega o elimina archivos entre la ejecución de find
y la ejecución de unison
o rsync
.
Puede parchear rsync o unison para agregar la opción de ignorar archivos según 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 cadenas, no a entradas de 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 físicos (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 físicos 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á tener cuidado de no romper enlaces físicos al editar o sincronizar. No sé cómo se las arreglarían rsync y unison. 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 sugerencias para mejorarlo.
Si la máquina compartida admiteFUSIBLE, puede usarlo para crear una vista en vivo del repositorio compartido que contenga solo sus archivos. No conozco ningún sistema de archivos FUSE que pueda hacerlo, peroenlazarse acerca (no he mirado el código para evaluar la dificultad de codificación).
Puede usar
LD_PRELOAD
to overridereaddir
(o un equivalente de Windows) cuando ejecute rsync o unison, para que solo devuelva archivos de su propiedad.