rsync: evitando excluir arquivos que não pertencem a um determinado usuário

rsync: evitando excluir arquivos que não pertencem a um determinado usuário

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 --excludeou --delete-excludedapenas 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_filese 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_1edir_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óriodir_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_1e dir_2,não dir_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 finde a execução de unisonor 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_PRELOADto override readdir(ou um equivalente do Windows) ao executar rsync ou unison, para que ele retorne apenas arquivos de sua propriedade.

informação relacionada