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

1

Estou usando o rsync para manter uma grande pasta de documentos compartilhados em sincronia com meu laptop. Mais especificamente, estou rsyncing do meu laptop para o repositório compartilhado. O que eu gostaria de fazer é rsyncing apenas os arquivos que foram criados / modificados pelo meu usuário. Sendo 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 estou procurando. Eu posso --exclude ou --delete-excluded , mas apenas dando padrões para coincidir com o nome do arquivo, não qualquer outro metadado (ou eu posso?).

Uma solução alternativa, mas um pouco complicada, poderia ser lançar um script remoto como find -not -perm $USER > excluded_files e rsync excluindo esses, mas prefiro não fazer isso.

Alguma idéia?

update: para esclarecer, os dados no meu laptop serão apenas parte dos dados no servidor. Aqui está um exemplo

  • meu laptop contém dir_1 e dir_2
  • Eu rsync eles para o servidor; agora o servidor contém dois dirs
  • outro usuário se conecta ao servidor e cria um novo diretório dir_3
  • Eu estrago meus arquivos, agora vou rsync novamente, mas preciso usar --delete
  • Desejo excluir APENAS os arquivos que criei em primeiro lugar, ou seja, os que estão em dir_1 e dir_2 , não dir_3
por lorenzog 14.09.2010 / 16:28

1 resposta

1

Presumo que manter uma cópia de todos os arquivos em seu laptop não é 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 uma quantidade mínima 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 com cuidado o que verificaria no seu laptop.

Você ainda pode usar o controle de versão. Na máquina compartilhada, verifique todos os seus arquivos e deixe os arquivos de outras pessoas em paz. Mantenha um checkout separado no seu laptop. Confirmar e verificar sempre que você trocar de máquina. Quanto mais eu penso sobre isso, mais eu gosto desta opção: não requer nenhum código ou mesmo qualquer script frágil.

Você faz a sincronização bidirecional. O rsync não é bom nisso: se você esquecer de executá-lo ou acidentalmente executá-lo na direção errada, provavelmente perderá o trabalho sem aviso. Unison é uma boa ferramenta para sincronização bidirecional: sempre sincroniza bidirecionalmente , e reclama se um arquivo foi alterado nos dois lados. É de código aberto e está bem integrado nas plataformas unix e Windows.

Infelizmente, o uníssono não tem a opção de ignorar arquivos pelo proprietário, mais do que o rsync faz. 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 ou rsync .

Você pode corrigir o rsync ou o uníssono para adicionar a opção de ignorar arquivos com base em seus metadados. Acabei de dar uma rápida olhada na fonte e, em ambos os casos, o código de exclusão está strongmente vinculado a cadeias, não a entradas de diretório. Parece factível, mas não é um patch trivial.

Você pode criar uma visualizaçã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 hard links (todos os unices fazem, e o Windows faz desde o NT4, desde que você use NTFS), é fácil criar uma cópia do repositório contendo apenas hard links 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ê precisa ter cuidado para não violar links físicos durante a edição ou a sincronização. Eu não sei como rsync e unison lidariam. Após a criação inicial, um arquivo no repositório compartilhado pertencente a você e com uma contagem de links de 1 deve ser excluído e um arquivo em sua visualização com uma contagem de links de 1 deve ser vinculado no repositório compartilhado. Isso tudo é bastante desajeitado, e eu gostaria de receber sugestões para melhorias.

  • Se a máquina compartilhada suportar FUSE , você poderá usá-la para criar uma exibição ao vivo do repositório compartilhado contendo apenas arquivos. Eu não sei de nenhum sistema de arquivos FUSE existente que possa fazer isso, mas bindfs chega perto (eu não olhei para o código para avaliar a dificuldade de codificação).

  • Você pode usar LD_PRELOAD para substituir readdir (ou um equivalente no Windows) ao executar o rsync ou unison, para que ele retorne apenas os arquivos de sua propriedade.

por 15.09.2010 / 20:14

Tags