rsync não excluirá arquivos no destino


22

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'?


Cuidado com / * no final dos diretórios de origem. Isso fará com que o rsync considere apenas esses arquivos, e não o diretório em si (e a ausência de arquivos que não existem mais).
Walt Stoneburner

Respostas:


9

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.


23

Retire o *. Conforme mencionado nas páginas de manual do rsync, a --deleteopção não funciona com entradas curinga.

Use isto:

rsync -a --delete $DIR1/ $DIR2/

"--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, dirou dir/) sem usar um curinga para o conteúdo do diretório (por exemplo dir/*), 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-excludedopçã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). "


Esta é funcionalmente o mesmo que a resposta de Sven partir de 2011.
Rowan Hawkins

8

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 é realmente rsync -a --delete $DIR1/b $DIR2.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.