
Estas são as etapas que executei:
Crie alguns arquivos de teste:
/tmp $ mkdir src tgt
/tmp $ cd src/
/tmp/src $ touch .test{1,2,3}
/tmp/src $ ls -la
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:02 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
Sincronize os diretórios src e tgt:
/tmp/src $ cd ..
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
3 files to consider
.test1
0 100% 0.00kB/s 0:00:00 (xfer#1, to-check=2/3)
.test2
0 100% 0.00kB/s 0:00:00 (xfer#2, to-check=1/3)
.test3
0 100% 0.00kB/s 0:00:00 (xfer#3, to-check=0/3)
sent 209 bytes received 86 bytes 590.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
Exclua um arquivo no src e sincronize novamente:
/tmp $ rm -rf src/.test1
/tmp $ ls -la src/
total 0
drwxr-xr-x 4 user wheel 136 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
/tmp $ rsync -avh --delete --progress src/.??* tgt
building file list ...
2 files to consider
sent 75 bytes received 20 bytes 190.00 bytes/sec
total size is 0 speedup is 0.00
/tmp $ ls -la tgt/
total 0
drwxr-xr-x 5 user wheel 170 18 Aug 15:03 .
drwxrwxrwt 11 root wheel 374 18 Aug 15:02 ..
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test1
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test2
-rw-r--r-- 1 user wheel 0 18 Aug 15:02 .test3
O arquivo .test1 não foi excluído do diretório tgt.
Por que a opção --delete não funciona neste caso?
Como faço para que o comando rsync exclua arquivos ocultos no destino?
Responder1
Isso não tem nada a ver com arquivos ocultos. Depois que rm
você nunca disse rsync
para se preocupar src/.test1
. De man 1 rsync
[ênfase minha]:
--delete
Isso indicarsync
para excluir arquivos estranhos do lado receptor (aqueles que não estão no lado remetente), masapenas para os diretórios que estão sendo sincronizados. Você deve ter solicitadorsync
o envio de todo o diretório (por exemplo,dir
oudir/
) sem usar um curinga para o conteúdo do diretório (por exemplodir/*
, )já que o curinga é expandido pelo shell e,rsync
portanto, recebe uma solicitação para transferir arquivos individuais, não o diretório pai dos arquivos. […]
Sincronize diretórios, não arquivos individuais:
rsync -avh --delete --progress src/ tgt
Responder2
O truque é sincronizar diretórios (como mencionado por @Kamil Maciorowski), mas também usar filtros de inclusão e exclusão para que apenas os arquivos de ponto sejam sincronizados em primeiro lugar:
rsync -avh --delete --progress --include '.*' --exclude '*' src/ tgt
Responder3
No meu caso, adicionar --ignore-errors
resolveu o problema.
Mais detalhes: Usando o cygwin para copiar de um servidor Linux para uma unidade USB do Windows.
A origem é server:/src
e o destino é /cygdrive/e
.
Havia um arquivo oculto que sobrou de uma execução anterior do rsync. O nome do arquivo era algo como.data.qpSS6L
Executar o seguinte comando feznãoexclua o arquivo:
rsync -rvvth --update server:/src /cygdrive/e --delete
O seguinte adiciona --ignore-errors e exclui o arquivo oculto corretamente:
rsync -rvvth --update server:/src /cygdrive/e --delete --ignore-errors