Você tentou adicionar --delete-excluded
?
Se você excluir um diretório em suas pastas excluídas no lado "remoto", rsync --delete
não excluirá a pasta excluída em seu site "local".
Ao executar este comando:
$ sudo rsync -r --delete --force --checksum --exclude=uploads /data/prep/* /data/app/
Estou recebendo a seguinte saída:
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins/uicolor
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source/plugins
cannot delete non-empty directory: html/js/ckeditor/_source
cannot delete non-empty directory: html/js/ckeditor/_samples
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor/yui
cannot delete non-empty directory: html/js/ckeditor/plugins/uicolor
Ao ler o man rsync
, tive a impressão de que a opção --force
diria ao rsync para excluir esses diretórios não vazios, que é o resultado desejado.
Ref:
--force force deletion of dirs even if not empty
Como posso modificar o comando para excluir os diretórios não vazios?
Estou usando o rsync versão 3.0.8, no Gentoo Base System versão 2.0.3, caso isso seja relevante.
Atualização: Adicionada sudo
ao comando para deixar claro que isso não é um problema de permissões de arquivo.
Aqui estão possíveis fontes para este problema:
(1) Este erro pode ser o resultado da opção -b (--backup). Esta opção criará um backup de cada arquivo excluído, anexando um til ( ~ ) em seu nome de arquivo. (Isso me confundiu, como o nome do arquivo é claramente um backup, mas o nome do diretório não é, como você não pode ver o til.)
Para verificar se este é o mesmo caso, leia seu diretório de destino no nível mais profundo e verifique se existe algum arquivo final de til (~). Note que estes nomes de arquivos anexados ao til são então invisíveis em algum sistema comum de navegação de arquivos, então você pode não vê-los.
Para resolver este caso, prefira a opção --backup-dir = DIR, por exemplo --backup-dir = .rsync_bak.
(2) A opção --exclude pode ter os mesmos resultados. O que possivelmente está acontecendo no seu caso. O sistema de padrões é poderoso, mas pode ser enganador. Por exemplo, se você escrever --exclude = '* ~', isso irá ignorar todos os arquivos finais do til, resultando exatamente como no caso (1) acima.
da página de manual do rsync:
if the pattern starts with a / then it is anchored to a particular spot in the hierarchy of files, otherwise it is matched against the end of the pathname
Si se você escrever --exclude = uploads, isso excluirá todos os arquivos chamados "updloads", em qualquer nível da sua árvore de arquivos.
Verifique se existe um arquivo chamado "uploads" dentro de seus diretórios impossíveis de excluir.
A solução seria alterar "--exclude = uploads" para "--exclude = uploads /"
Na minha configuração ((a origem é o formato do Ubuntu tipo ext4 para direcionar o fuseblk do tipo Western Digital) ele funciona com:
rsync -a -v --progress --modify-window=1 -c -b -i -s -m --del -vv --ignore-errors --chmod=ugo=rwx --delete --delete-excluded --exclude='*~' --exclude='.*' --backup-dir=.rsync_bak /home/test /media/user/usbHDD
Um diretório deve estar vazio para que você o exclua, o sistema de arquivos normalmente requer isso.
Portanto, normalmente rsync
ou rm
recursivamente excluiria todo o conteúdo primeiro e só então excluiria o diretório agora vazio.
Se o usuário atual não for o proprietário de todos os arquivos, as permissões do sistema de arquivos não permitirão que você exclua esses arquivos. Como eles não serão removidos, o diretório não será esvaziado e a exclusão falhará.
Meu primeiro palpite é que alguns arquivos nesse diretório são de propriedade de outro usuário, por exemplo, o apache ou ninguém usuários.