Estou usando o rsync para buscar arquivos essenciais de um servidor e exclua os arquivos do servidor assim que os tiver localmente. O comando completo que estou executando está abaixo.
Isso exclui com êxito os arquivos no servidor de origem, no entanto, os diretórios vazios ainda permanecem. Não recebo nenhuma mensagem ou erro. Toda a saída é normal. Talvez esta seja a funcionalidade pretendida.
Como posso dizer ao rsync para limpar tudo, incluindo os diretórios?
rsync --progress -vrzh --remove-source-files
A versão é 3.0.9 em ambas as extremidades.
Respostas:
O comportamento
--remove-source-files
que você observa é exatamente o especificado porman rsync
:Não há um comando específico para remover os diretórios, como essas duas discussões no StackExchange e ServerFault mostram claramente. A solução sugerida é emitir dois comandos separados:
A última parte do comando sugerida nessas duas postagens,
o que é necessário para remover o diretório de origem (agora esvaziado) tem esse formato nessas postagens porque os OPs e as respostas estão usando o rsync para mover grandes quantidades de arquivos na mesma máquina. No seu caso, você terá que fazer isso manualmente.
fonte
rsync --delete
sugestão é perigosa, porque ignora a possibilidade de que o rsync não tenha sido concluído ou que haja novos arquivos na fonte. Ofind
método do @ slhck abaixo é muito mais seguro.A página de manual ainda diz:
Se você deseja remover diretórios vazios em sua fonte, se ainda houver arquivos, faça o seguinte:
Mas para um diretório raiz vazio, uma
rm -rf <directory>
vontade é suficiente.fonte
find some_dir -depth -type d -empty -not -path some_dir -delete
O uso de " rm -rf " tem uma condição de corrida inerente, você pode excluir os arquivos que foram criados entre as invocações rsync e rm .
Eu prefiro usar:
Isso NÃO removerá os diretórios se eles não estiverem vazios.
fonte
rm -rf
também irá remover arquivos que não foram transferidos por algum motivo.-depth
opção que instruifind
a processar na ordem correta. Como resultado dessa falha, os diretórios que contêm apenas diretórios vazios (possivelmente recursivamente) não serão excluídos. A variante de @slhck está correta.-m, --prune-empty-dirs
podar cadeias de diretórios vazias da lista de arquivos--force
forçar a exclusão de diretórios, mesmo se não estiver vaziofonte
Remova os arquivos de origem e remova os diretórios para garantir a segurança.
fonte