Rsync apenas arquivos de usuário específico

Rsync apenas arquivos de usuário específico

Existe uma maneira de sincronizar novamente apenas arquivos de um determinado usuário? Eu tenho uma pasta que contém arquivos de vários usuários, mas gostaria apenas de fazer backup dos arquivos de um usuário específico.

Eu olhei as páginas de manual do rsync, mas não parece haver tal sinalizador.

Alguma ideia?

Responder1

Não, não há como destacar, diretamente da linha de comando do rsync, os arquivos de um usuário específico.

No entanto, é muito fácil gerar uma lista desses arquivos, por exemplo, com um comando como

   find /src/directory -type f -exec ls -lh {} \; | awk '{if ($3 == "your_name") for (i=1; i<=NF-8; i++) $i = $(i+8); NF-=8; print}'

findencontra todos os arquivos na árvore abaixo do diretório /src/, e imprime uma longa listagem que inclui o proprietário, depois passa essas listagens para awk, que seleciona aqueles que pertencem a você ("seu_nome") e então, apenas para estes, imprime o caminho completo. A construção estranha que começa com foré devido ao fato de que alguns dos nomes de arquivos podem incluir um espaço, então esta construção imprime todos os tokens ( i.e., todas as sequências de caracteres delimitadas por espaço) a partir da 9ª coluna (os nomes dos arquivos podem incluir um número arbitrário de espaços). Além disso, essa construção garante que isso permaneça em uma única linha.

Você pode redirecionar esta saída para um arquivo e usar o rsync somente nos arquivos listados neste arquivo.

Responder2

A resposta de MariusMatutiae não funcionou para mim: cheguei lá -rw-r--r--apenas com muitas linhas.

Então desenvolvi esta resposta:

  1. O findcomando tem a opção -user(e -group) que é muito mais fácil de usar. Precisamos de caminhos/nomes de arquivos relativos:
    a) findopção: -printf '%P\n'ou
    b) canalizarsed -e "s#/path##"
  2. rsync oferece a possibilidade de sincronizar arquivos: . Você precisa deste arquivo local. Então você tem que fazer push rsync dos arquivos, ou o servidor que puxa deve obtê-lo primeiro do lado remoto onde a lista foi gerada antes.--files-from=FILE

=> Para o meu exemplo, isso funciona:
1a) find /usr/share/piwik/ -user www-data -printf '%P\n' > /tmp/find-piwik-rsync.listou
1b)find /usr/share/piwik/ -user www-data | sed -e "s#/usr/share/piwik/##" > /tmp/find-piwik-rsync.list

2)rsync -a --files-from=/tmp/find-piwik-rsync.list /usr/share/piwik/ remote:/usr/share/piwik

Você deve primeiro testá-lo com -n/ --dry-run.

informação relacionada