rsync não pode excluir o diretório não vazio

10

Ao sincronizar meu backup remoto, recebo o erro rsync cannot delete non-empty directory.

Conheço a causa: excluí alguns arquivos e quando o rsync tenta excluir um diretório remoto porque ele não existe localmente, não pode, pois não está vazio. Sem a exclusão, o diretório seria esvaziado.

Eu também sei que poderia me livrar do problema usando --delete-excluídos, mas isso não é o que eu quero.

Gostaria de pular o upload de certos arquivos (porque eles são grandes demais para a minha velocidade de upload), mas quero manter aqueles que já foram enviados há algum tempo, se existirem localmente . Se eles não existirem localmente, devem ser excluídos. --delete-exclusão excluiria todos eles no lado remoto.

Isso também significa que, se um diretório não existir mais localmente, ele deverá ser excluído, mesmo que contenha arquivos excluídos.

É possível configurar o rsync para fazer isso?

marlar
fonte

Respostas:

5

Use o pmodificador:

Um p indica que uma regra é perecível, o que significa que é ignorada nos diretórios que estão sendo excluídos. Por exemplo, as regras padrão da opção -C que excluem itens como "CVS" e "* .o" são marcadas como perecíveis e não impedem que um diretório removido na fonte seja excluído no destino.

Por exemplo, eu uso a -Fopção, que "diz ao rsync para procurar por arquivos .rsync-filter por diretório que foram espalhados pela hierarquia e usar suas regras para filtrar os arquivos na transferência".

Meu .rsync-filtercontém linhas como estas para filtrar esses "excrementos" que os Macs deixam para trás:

-p .DS_Store
-p ._*

Se estiver usando em excludevez de apenas -, adicione uma vírgula. Por exemplo :

exclude,p .DS_Store
exclude,p Thumbs.db
mivk
fonte
0

Você pode usar modificadores do padrão de inclusão / exclusão, adicionar -s no padrão usado. Diz ao rsync que exclui a regra apenas para o lado de envio.

-n: verifique apenas o que será excluído no desc, não exclua o padrão: * .sh desc: / home / kg / tmp

aim: deseja excluir o final do arquivo .sh no desc, mas se você fizer isso, não poderá excluir no desc: rsync -rvz --exclude * .sh --delete -n conkg [email protected]: / casa / kg / tmp

deve mudar para: adicione -n ​​ao testar o teste: rsync -rvz --exclude-from del.txt -n - exclua conkg [email protected]: / home / kg / tmp real delete: rsync -rvz - excluir do del.txt - excluir conkg [email protected]: / home / kg / tmp cat del.txt -s * .sh

ou: rsync -rvz --exclude -s * .sh - exclua conkg [email protected]: / home / kg / tmp

kg deng
fonte
-2

basta usar as opções '--max-size = xx' e '--delete' do rsync. Ele fará tudo automaticamente e atenderá a todos os seus requisitos.

sparkie
fonte
Seria, no máximo, uma solução alternativa. Eu quero pular arquivos mov, avi e cr2 completamente, porque eles geralmente são muito grandes. Mas aqueles que eu já carreguei em uma linha mais rápida há algum tempo devem ser mantidos. Agora, o problema é que os maiores arquivos JPG são maiores que os menores arquivos CR2, portanto, essa solução não é ideal. Prefiro usar o recurso de exclusão para filtrar nomes de arquivos.
Marlar