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 quersync --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