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
, fiquei com a impressão de que a --force
opção instruiria o rsync a 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: adicionado sudo
ao comando para deixar claro que este não é um problema de permissão de arquivo.
ext3
. É possível que o sistema de arquivos esteja precisando ou seja reparado. Voufsck
na próxima oportunidade e atualizar com os resultados.fsck
de encontrar o sistema e esse problema ainda está presente.Respostas:
Você tentou adicionar
--delete-excluded
?Se você excluir um diretório nas pastas excluídas no lado "remoto",
rsync --delete
não excluirá a pasta excluída no site "local".fonte
uploads
nos diretórioshtml/js/ckeditor/_source/plugins/uicolor/yui
,html/js/ckeditor/_samples
ehtml/js/ckeditor/plugins/uicolor/yui
. Obrigado pela ajuda.--delete-excluded
mas você ainda deseja excluir certos arquivos / diretórios da exclusão, é possível colocar esses arquivos / diretórios--filter 'protect some_dir/'
, por exemplo:rsync -ac --delete --delete-excluded --exclude '*.html' --filter 'protect .git/' . /target/destination/
Aqui estão as fontes possíveis desse problema:
(1) Este erro pode ser o resultado da opção -b (--backup). Essa opção criará um backup de cada arquivo excluído, acrescentando um til ( ~ ) ao nome do arquivo. (Isso me confundiu, pois o nome do arquivo é claramente um backup, mas o nome do diretório não é, pois você não pode ver o til.)
Para verificar se esse é o mesmo caso, leia o diretório de destino no nível mais profundo e verifique se há algum arquivo final de til (~). Observe que esses nomes de arquivos anexados a til são então invisíveis em algum sistema comum de navegação de arquivos, portanto, você pode não vê-los.
Para resolver esse 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 enganoso. Por exemplo, se você escrever --exclude = '* ~', isso ignorará todos os arquivos de finalização de til, resultando exatamente como no caso (1) acima.
da página de manual do rsync:
Se você escrever --exclude = uploads, isso excluirá todos os arquivos denominados "updloads", em qualquer nível da sua árvore de arquivos.
Verifique se há um arquivo chamado "uploads" dentro de seus diretórios incapazes de excluir.
A solução seria alterar "--exclude = uploads" para "--exclude = uploads /"
fonte
Na minha configuração ((fonte é o formato Ubuntu, tipo ext4, para direcionar o tipo Western Digital fuseblk), ele trabalha com:
fonte
Use regras em arquivos de filtro em vez de
--exclude
. Isso permite que você marque as exclusões como "persizáveis", o que permitirá excluir diretórios não vazios que contêm arquivos excluídos.Veja esta resposta para detalhes.
fonte
Um diretório precisa estar vazio para que você possa excluí-lo; o sistema de arquivos normalmente exige isso.
Portanto, normalmente
rsync
ourm
excluiria recursivamente todo o conteúdo primeiro e somente depois 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 excluir esses arquivos. Como eles não serão removidos, o diretório não será esvaziado e a exclusão falhará.
Meu primeiro palpite seria que alguns arquivos desse diretório sejam de propriedade de outro usuário, por exemplo, o apache ou de ninguém.
fonte
ls -la
para ver por que o diretório ainda não está vazio.lsattr
exibirá arquivos imutáveis.lsattr
partir de um dos diretórios listados gera o seguinte:--------------- ./assets
(sem sinalizador i) e o arquivo não está em uma montagem nfs. Existem outras razões pelas quais você poderia pensar por que o comando ainda falharia com o sudo?