O diretório de exclusão do rsync não está funcionando

Estou executando o Fedora 17 de 64 bits e o rsync --exclude=/home/ben/<dir> não está funcionando conforme o esperado .

Estou tentando rsync meu diretório inicial em um pen drive, mas quero excluir certamente os diretórios que contêm arquivos de cache e arquivos de construção. Este é o comando que estou usando:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home/ben home-ben/ 

No entanto, o conteúdo de ~/build e ~/.ccache está sendo copiado por rsync. O que estou fazendo de errado?

Comentários

  • Acho que excluir padrões simplesmente não ' funciona.

Resposta

Regras de filtro rsync globais que começam com um / inicial são ancoradas na raiz de transferência. Citando a seção “INCLUIR / EXCLUIR REGRAS DE PADRÃO” da página de manual:

se o padrão começar com um /, ele será ancorado em um ponto particular na hierarquia de arquivos, caso contrário, ele é comparado ao final do nome do caminho. Isso é semelhante a um ^ inicial em expressões regulares. Assim, “/ foo” corresponderia a um nome de “foo” na “raiz do transferir “(para uma regra global) ou no diretório do arquivo de mesclagem (para uma regra por diretório).

Em seu comando (rsync ... -arv /home/ben home-ben/), o arquivo /home/ben/foo seria transferido para home-ben/ben/foo. A raiz da transferência é home-ben e o caminho de filtro correto é /ben/foo. Portanto,

  • para corresponder a /home/ben/.ccache, você precisa de um caminho de filtro de /ben/.ccache
  • para corresponder a /home/ben/build/, você precisa de um caminho de filtro de /ben/build/

Uma explicação mais detalhada pode ser encontrado na seção “ANCHORING INCLUDE / EXCLUDE PATTERNS” da rsync(1) página do manual .


Observe que simplesmente omitir o / inicial não é necessariamente o que você deseja. Citando novamente da mesma seção da página de manual:

Um “foo” não qualificado corresponderia a um nome de “foo” em qualquer lugar da árvore porque o algoritmo é aplicado recursivamente de cima para baixo; ele se comporta como se cada componente do caminho tivesse uma chance de ser o final do nome do arquivo. Até mesmo o “sub / foo” não ancorado corresponderia a qualquer ponto na hierarquia onde um “foo” fosse encontrado em um diretório denominado “sub”. Consulte a seção ANCHORING INCLUDE / EXCLUDE PATTERNS para uma discussão completa sobre como especificar um padrão que corresponda à raiz da transferência.

Assim, um padrão de filtro de build/ corresponderia a um diretório de construção em qualquer lugar em /home/ben, mesmo /home/ben/many/sub/directories/build/.

Comentários

  • O detalhe chave é que barras são importantes . Se você anexar uma barra ao final do diretório de origem (rsync -a origem / destino), ele copiará o conteúdo da origem, caso contrário, rsync -a source destination copia o próprio diretório de origem para o destino. Isso determina qual será a raiz da transferência para informar a expressão de exclusão. O uso adequado de / na expressão de exclusão é explicado acima. Observe em particular que rsync --exclude='/dir1' source destination ganhou ' t excluir nada.

Resposta

AVISO: Por comentário de @ rubo77 “abaixo , essa resposta só deve ser usada se você estiver disposto a excluir esses itens de todos os lugares da árvore de origem, não apenas da raiz. Veja a resposta de @ jw013 “acima para uma explicação mais completa.

Eu acho que seus exclude caminhos precisam ser relativos ao caminho de origem. Pode você tenta fazer isso?

rsync --exclude=build/ --exclude=.ccache -arv /home/ben home-ben/ 

Aqui está um teste, para comparação:

/tmp$ tree src dest src ├── a └── b dest └── foo/ /tmp$ rsync -nav --exclude /tmp/src/b /tmp/src /tmp/dest sending incremental file list src/ src/a src/b $ rsync -nav --exclude b /tmp/src /tmp/dest sending incremental file list src/ src/a 

Comentários

  • Essa resposta está errada. Com um caminho de exclusão relativo, você excluiria o padrão em todos os lugares!
  • Esta postagem está correta. A correspondência é baseada em texto, não baseada em inode de arquivo. Qualquer que seja o caminho que a saída do comando --verbose mostre, é o formato que você deve usar.
  • Isso funcionou para mim.
  • E se o o caminho de origem é ' / ' então absoluto são os caminhos relativos, mas ainda não ' funcione.
  • Essa é a única coisa que funcionou para mim.

Resposta

Seu padrão de exclusão funcionaria, se você sincronizar todo o caminho / home, ou seja,sem uma barra final:

rsync --exclude=/home/ben/build/ --exclude=/home/ben/.ccache -arv /home home-all/ 

Mas melhor apenas rsync o conteúdo da pasta com uma barra final:

rsync --exclude=/build --exclude=/.ccache -arv /home/ben/ home-ben/ 

Você também pode usar uma lista de ignorados, consulte: https://askubuntu.com/questions/545655/backup-your-home-directory-with-rsync-and-skip-useless-folders

Resposta

Tive este problema em um script (não sei se é o seu caso). Eu estava porque usei esse comando em um script e estava usando sh em vez de bash. verifique o texto no início do seu script.

Comentários

  • Como a escolha do interpretador de shell causaria esse problema específico?

Resposta

Para excluir uma pasta específica com rsync, você precisa considerar o caminho relativo no comando. no seu caso:

rsync --exclude=/ben/build/ --exclude=/ben/.ccache -arv /home/ben home-ben/ 

onde “ben” é a pasta que você está sincronizando

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *