rsync exclui o diretório não está funcionando

28

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

Estou tentando rsync meu diretório inicial em um pen drive, mas desejo excluir diretórios que mantêm arquivos em cache e compilam arquivos. 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 errado?

    
por Freedom_Ben 17.07.2013 / 18:24

4 respostas

32

Regras de filtro globais rsync que começam com um / inicial estão ancoradas na raiz da transferência. Citando a seção "INCLUDE / EXCLUDE PATTERN RULES" da página man:

if the pattern starts with a / then it is anchored to a particular spot in the hierarchy of files, otherwise it is matched against the end of the pathname. This is similar to a leading ^ in regular expressions. Thus "/foo" would match a name of "foo" at either the "root of the transfer" (for a global rule) or in the merge-file's directory (for a per-directory rule).

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 correto do filtro é /ben/foo . Assim,

  • 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 encontrada na seção "ANCORAGEM INCLUIR / EXCLUIR PADRÕES" do rsync(1) man página .

Note que simplesmente deixar de fora o primeiro / não é necessariamente o que você deseja. Citando novamente a partir da mesma seção da página man:

An unqualified "foo" would match a name of "foo" anywhere in the tree because the algorithm is applied recursively from the top down; it behaves as if each path component gets a turn at being the end of the filename. Even the unanchored "sub/foo" would match at any point in the hierarchy where a "foo" was found within a directory named "sub". See the section on ANCHORING INCLUDE/EXCLUDE PATTERNS for a full discussion of how to specify a pattern that matches at the root of the transfer.

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

    
por 17.07.2013 / 19:42
8

Acho que seus caminhos exclude precisam ser relativos ao caminho de origem. Você pode tentar 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
    
por 17.07.2013 / 19:41
2

Eu tive esse problema em um script (não sei se é o seu caso). Eu era porque eu usei esse comando em um script e eu estava usando sh ao invés de bash. verifique o shebang no início do seu script.

    
por 22.07.2016 / 21:57
1

Seu padrão de exclusão funcionaria se você rsync o caminho / home inteiro, 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:

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

Você também pode usar uma lista de ignorados, veja: link

    
por 04.02.2018 / 06:13

Tags