Eu li os documentos do rsync e examinei os tópicos aqui, mas não consigo encontrar uma correspondência simples para minhas necessidades.
Desejo copiar vários diretórios/arquivos da origem para um diretório de destino. Quero a cópia incremental, mas quero que qualquer outra coisa seja removida do destino. Assim, no destino terminamos com um backup exato das fontes especificadas e nada mais.
#!/bin/bash
mkdir -p source/{A,B,C,D}
touch source/{A,B,C,D}/file
mkdir -p /tmp/dest/{A,B,E,F}
touch /tmp/dest/{A,B,E,F}/file
cd source
rsync -av --delete A B /tmp/dest/
Eu quero /tmp/dest
acabar com nada além de A
e B
, então E
e F
deveria ser excluído --- mas eles não o fazem . Observe que não desejo copiar C
e D
da fonte. Observe que não sei o que mais pode ou não estar no destino (nem na origem).
Este parece ser um requisito bastante comum para fazer backup de alguns itens seletivos e fazer com que o destino contenha nada além do que foi solicitado. Alguém tem o comando exato para isso, por favor?
Você deve sincronizar
source
enquantodest
usa filtros de inclusão e exclusão para especificar exatamente o que deseja.Quando você sincroniza
A
eB
de dentrosource
paradest
, você basicamente sincronizasource/A
comdest/A
esource/B
comdest/B
. O utilitário não tem conhecimento de quaisquer outros diretóriossource
oudest
como eles devem ser tratados.Em vez de:
Isto pede
rsync
para fazersource
edest
idêntico dentro das restrições dadas pelos vários filtros. O/
final desource/
é essencial (sem ele, você obteria/tmp/dest/source
um diretório), enquanto o/
final do caminho de destino é para garantir que seja realmente um diretório. Os filtros são aplicados a cada nome nosource
estilo "vitória na primeira partida". Os dois filtros de inclusão corresponderão aosA
subdiretóriosB
e e a todo o seu conteúdo (recursivamente). O filtro de exclusão corresponderá a qualquer outra coisa.Executamos com
--delete
e--delete-excluded
which excluirá arquivos que não deveriam existir nodest
destino (por exemplo,E
eF
ou qualquer arquivo excluído emA
ouB
) e excluirá qualquer coisa que corresponda a um filtro de exclusão (por exemplo,C
eD
se eles existissem emdest
).De um comentário sobre expressões de filtro:
Em um filtro de inclusão ou exclusão,
*
corresponde a qualquer nome em um diretório,**
corresponde a qualquer nome em um diretório ou abaixo dele, e***
corresponde a qualquer nome em um diretório ou abaixo dele, mas também ao próprio diretório , ou seja,A/***
eB/***
correspondeA
a eB
, não apenas ao seu conteúdo . Se usássemosA/**
eB/**
, esses diretórios nunca seriam sincronizados porque o padrãoA/**
não correspondeA
eB/**
não correspondeB
.Isso está descrito no
rsync(1)
manual.