A opção Rsync --delete não está excluindo dotfiles ocultos no destino

A opção Rsync --delete não está excluindo dotfiles ocultos no destino

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 rmvocê nunca disse rsyncpara se preocupar src/.test1. De man 1 rsync[ênfase minha]:

--delete
Isso indica rsyncpara 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 solicitado rsynco envio de todo o diretório (por exemplo, dirou dir/) sem usar um curinga para o conteúdo do diretório (por exemplo dir/*, )já que o curinga é expandido pelo shell e, rsyncportanto, 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-errorsresolveu o problema.

Mais detalhes: Usando o cygwin para copiar de um servidor Linux para uma unidade USB do Windows.

A origem é server:/srce 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

informação relacionada