rsync não apagará arquivos no destino

16

Estou tentando espelhar um diretório que muda com o tempo para outro diretório. Meu problema é que o rsync não está excluindo arquivos no destino se eles não estiverem 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'?

    
por halp 21.01.2011 / 14:23

3 respostas

7

O motivo é porque você está chamando o rsync em / tmp / 1 / b, o que não considerará o arquivo / tmp / 1 / a.

Sua intenção parece ser rsync o diretório / tmp / 1 / - se você usar "/ tmp / 1 /" como a fonte ao invés dos arquivos individuais, ele irá notar que "a" foi deletado do diretório. diretório e removê-lo do destino.

    
por 21.01.2011 / 14:32
20

Remova o * . Como mencionado nas páginas man do rsync, a opção --delete não funciona com entradas curinga.

Use isso:

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

" --excluir               Isso diz ao rsync para excluir arquivos estranhos do lado do 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 que envie o diretório inteiro (por exemplo, dir ou dir/ ) sem usar um caractere curinga para o conteúdo do diretório (por exemplo, dir/* ), pois o curinga é expandido pelo shell e o rsync obtém um pedido 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 da exclusão, a menos que você use a opção --delete-excluded ou marque as regras como correspondências apenas no lado de envio (consulte os modificadores de inclusão / exclusão na seção REGULAMENTOS DE FILTRO). "

    
por 21.01.2011 / 14:35
7

Se você alterar a segunda linha de rsync para rsync -a --delete $DIR1/ $DIR2 (sem o *), ela funcionará. A razão é que o shell expande o * para os nomes dos arquivos no primeiro diretório, que é apenas b no seu caso, então o arquivo ausente a não será considerado pelo rsync, já que o comando executado é na verdade rsync -a --delete $DIR1/b $DIR2 .

    
por 21.01.2011 / 14:33

Tags