
Estou usando o rsync para manter uma grande pasta de documentos compartilhados sincronizada com meu laptop. Mais especificamente, estou sincronizando novamente DO meu laptop PARA o repositório compartilhado. O que eu gostaria de fazer é sincronizar novamente apenas os arquivos que foram criados/modificados pelo meu usuário. Por ser um repositório compartilhado, outras pessoas podem ter criado outros diretórios ou arquivos.
Naveguei pelas várias opções de rsync, mas não encontrei o que procuro. Posso --exclude
ou --delete-excluded
apenas fornecer padrões para corresponder ao nome do arquivo, e não quaisquer outros metadados (ou posso?).
Uma solução alternativa, mas um tanto complicada, poderia ser lançar um script remoto como find -not -perm $USER > excluded_files
e rsync excluindo-os, mas prefiro não fazer isso.
Alguma ideia?
atualização: para esclarecer, os dados do meu laptop serão apenas parte dos dados do servidor. Aqui está um exemplo
- meu laptop contém
dir_1
edir_2
- Eu os sincronizo novamente com o servidor; agora o servidor contém dois diretórios
- outro usuário efetua login no servidor e cria um novo diretório
dir_3
- Eu baguncei meus arquivos, agora vou sincronizar novamente, mas preciso usar --delete
- Eu quero --delete SOMENTE os arquivos que criei em primeiro lugar, ou seja, aqueles em
dir_1
edir_2
,nãodir_3
Responder1
Presumo que manter uma cópia de todos os arquivos do seu laptop não seja uma opção. Caso contrário, seria muito mais fácil.
A ferramenta certa aqui é uma ferramenta de controle de versão. Mas percebo que, a menos que todos os usuários tenham um mínimo de sofisticação técnica, fazê-los usar ferramentas de controle de versão não é uma sugestão realista. E mesmo assim você teria que escolher cuidadosamente o que verificar em seu laptop.
Vocêainda pode usar o controle de versão. Na máquina compartilhada, faça check-in de todos os seus arquivos e deixe os arquivos de outras pessoas em paz. Mantenha um checkout separado em seu laptop. Confirme e verifique sempre que trocar de máquina. Quanto mais penso nisso, mais gosto desta opção: ela não requer nenhuma codificação ou mesmo script frágil.
Você faz sincronização bidirecional. O Rsync não é bom nisso: se você esquecer de executá-lo ou executá-lo acidentalmente na direção errada, provavelmente perderá o trabalho sem aviso prévio.Uníssonoé uma boa ferramenta para sincronização bidirecional: sempre sincroniza bidirecionalmente e reclama se um arquivo foi alterado em ambos os lados. É de código aberto e bem integrado às plataformas Unix e Windows.
Infelizmente, o unison não tem a opção de ignorar arquivos por proprietário, assim como o rsync. Você pode gerar uma lista de ignorados com find -user
, mas fica confuso e há uma condição de corrida se alguém adicionar ou excluir arquivos entre a execução de find
e a execução de unison
or rsync
.
Você pode corrigir o rsync ou o unison para adicionar a opção de ignorar arquivos com base em seus metadados. Acabei de dar uma olhada rápida na fonte e, em ambos os casos, o código de exclusão está fortemente vinculado a strings, não a entradas de diretório. Parece factível, mas não é um patch trivial.
Você poderia criar uma visão do sistema de arquivos que contém apenas seus arquivos. Não tenho uma solução completa e perfeita, mas aqui estão algumas ideias para começar.
Se a máquina compartilhada suportar links físicos (todos os dispositivos suportam, e o Windows desde o NT4, desde que você use NTFS), é fácil criar uma cópia do repositório contendo apenas links físicos de seus arquivos:
cd /shared/repository find . -user "$USER" -exec sh -c 'mkdir -p "/my/view/${0%/*}" && ln "$0" "/my/view/$0"' {} \;
ou com zsh:
autoload zmv zmv -L -Q '/shared/repository/(**/)(*)(u$UID)' "/my/view/$1$2"
Você teria que ter cuidado para não quebrar links físicos ao editar ou sincronizar. Não sei como o rsync e o unison lidariam. Após a criação inicial, um arquivo no repositório compartilhado que pertence a você e tem uma contagem de links 1 deve ser excluído, e um arquivo em sua visualização com uma contagem de links 1 deve ser vinculado no repositório compartilhado. Tudo isso é bastante desajeitado e eu gostaria de receber sugestões de melhorias.
Se a máquina compartilhada suportarFUSÍVEL, você pode usá-lo para criar uma visualização ao vivo do repositório compartilhado contendo apenas seus arquivos. Não conheço nenhum sistema de arquivos FUSE existente que possa fazer isso, masbindfschega perto (não olhei o código para avaliar a dificuldade de codificação).
Você pode usar
LD_PRELOAD
to overridereaddir
(ou um equivalente do Windows) ao executar rsync ou unison, para que ele retorne apenas arquivos de sua propriedade.