Então, tenho um problema aparentemente simples, mas até agora não encontrei uma solução: quero excluir o diretório superior de um rsync, enquanto ainda sincronizo todos os seus filhos. O problema específico é que não tenho permissão para modificar os horários do diretório superior, mas quero que todos os filhos tenham horários sincronizados corretamente.
O comando rsync que estou usando é o seguinte:
rsync --exclude ./ -rlptDu ./ server.example.com:/usr/local/directory/
e server.example.com:/usr/local/directory/
fica assim:
drwxrws--- 5 root staff 24576 Jul 9 15:00 .
(meu usuário local é membro de staff
)
Quando executo o rsync, recebo o seguinte erro:
rsync: failed to set times on "/usr/local/directory/.": Operation not permitted (1)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1070) [sender=3.0.9]
make: *** [pub_to_mel_internal] Error 23
Esta é a versão 3.0.9 na máquina local e 3.0.7 na remota, ambas as máquinas rodando Debian.
Responder1
Acho que as regras de filtro do rsync não podem corresponder ao diretório de nível superior, por isso está sempre sincronizado. Uma solução alternativa é sincronizar todos os arquivos dentro deste diretório em vez do próprio diretório.
rsync -rlptDu -- * server.example.com:/usr/local/directory/
Adicione .[!.]*
depois *
se você tiver arquivos de ponto no diretório superior e ..?*
se tiver nomes de arquivo começando com dois pontos.
Responder2
Parece que o rsync pode excluir o diretório superior usando --files-from
:
$ rsync -anv from/ to/
sending incremental file list
./
a
b.test
sent 97 bytes received 25 bytes 244.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
$ printf '%s\n' 'a' 'b.test' | rsync -anv --files-from=- from/ to/
building file list ... done
a
b.test
sent 88 bytes received 22 bytes 220.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Apenas tropecei nele, deixando uma pista aqui caso ajude alguém (ou a mim no futuro).