Estou tentando espelhar um diretório que muda ao longo do tempo para outro diretório. Meu problema é que o rsync não está excluindo arquivos no destino se eles não existirem mais no diretório de origem. Aqui está um script de demonstração:
#!/bin/sh
set -x
DIR1=/tmp/1
DIR2=/tmp/2
rm -rf $DIR1
rm -rf $DIR2
mkdir $DIR1
mkdir $DIR2
echo "foo" > $DIR1/a
echo "bar" > $DIR1/b
rsync -a $DIR1/* $DIR2
rm -f $DIR1/a
rsync -a --delete $DIR1/* $DIR2
ls -1 $DIR2
Aqui está a saída:
+ DIR1=/tmp/1
+ DIR2=/tmp/2
+ rm -rf /tmp/1
+ rm -rf /tmp/2
+ mkdir /tmp/1
+ mkdir /tmp/2
+ echo foo
+ echo bar
+ rsync -a /tmp/1/a /tmp/1/b /tmp/2
+ rm -f /tmp/1/a
+ rsync -a --delete /tmp/1/b /tmp/2
+ ls -1 /tmp/2
a
b
Como você pode ver, o arquivo "a" ainda está presente no diretório de destino depois que o rsync é executado pela segunda vez, o que não é o que eu preciso. Estou usando mal a opção '--delete'?
Respostas:
O motivo é que você está chamando o rsync em / tmp / 1 / b, que não considerará o arquivo / tmp / 1 / a.
Sua intenção parece ser sincronizar o diretório / tmp / 1 / - se você usar "/ tmp / 1 /" como fonte e não os arquivos individuais, perceberá que "a" foi excluído do diretório e removido do alvo.
fonte
Retire o
*
. Conforme mencionado nas páginas de manual do rsync, a--delete
opção não funciona com entradas curinga.Use isto:
"--delete Diz ao rsync para excluir arquivos estranhos do lado de recebimento (aqueles que não estão no lado de envio), mas apenas para os diretórios que estão sendo sincronizados. Você deve ter solicitado ao rsync para enviar o diretório inteiro (por exemplo,
dir
oudir/
) sem usar um curinga para o conteúdo do diretório (por exemplodir/*
), uma vez que o curinga é expandido pelo shell e o rsync recebe uma solicitação para transferir arquivos individuais, não o diretório pai dos arquivos.Os arquivos excluídos da transferência também são excluídos de serem excluído, a menos que você use a--delete-excluded
opção ou marque as regras como correspondendo apenas no lado de envio (consulte os modificadores de inclusão / exclusão na seção REGRAS DE FILTRO). "fonte
Se você alterar a segunda linha rsync para
rsync -a --delete $DIR1/ $DIR2
(sem o *), ela funcionará. O motivo é que o shell expande*
para os nomes de arquivo no primeiro diretório, que é apenas b no seu caso, portanto, o arquivo ausente a não será considerado pelo rsync, pois o comando executado é realmentersync -a --delete $DIR1/b $DIR2
.fonte