Recentemente, precisei excluir um grande número de arquivos (mais de 1 milhão) e li isso fazendo:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Foi uma das maneiras mais otimizadas de fazer isso, e posso garantir que é mais rápido que rm -rf
.
Eu não sou um especialista no assunto, mas, pelo meu entendimento, a razão do desempenho do rsync tem algo a ver com a maneira como lista os arquivos (LIFO em vez de FIFO, suponho). Agora, o problema é que também preciso mover um grande número de arquivos de maneira eficiente. Depois de pesquisar um pouco, achei o seguinte:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Enquanto isso exclui todos os movidos arquivos em ~/source
, os diretórios permanecem lá. Como eu tenho uma estrutura de diretório do tipo "round-robin", o número de files/directories
é muito próximo de 1, então sou forçado a executar o primeiro comando novamente para livrar-me completamente do diretório:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Uma sequência mv
terminaria virtualmente instantaneamente, mas meu ~/destination
diretório possui arquivos que devem ser mantidos, portanto mv
não é uma opção. Encontrei as opções --prune-empty-dirs
e --force
rsync, mas nenhuma parece funcionar como eu esperava:
--force force deletion of directories even if not empty
--prune-empty-dirs prune empty directory chains from the file-list
--remove-source-files sender removes synchronized files (non-dirs)
Existe uma maneira de imitar uma jogada com o rsync de uma só vez?
Respostas:
Encontrei este tópico no stackoverflow intitulado: Excluindo pastas com o rsync "move"? , que está fazendo essencialmente a mesma pergunta. Uma das respostas sugeriu a
rsync
execução dos comandos in 2, pois parece que não há um único comando que possa realizar a movimentação / remoção dos arquivos e dos diretórios de origem.Como alternativa, você pode fazer isso usando este comando:
Não é o ideal, mas faz o trabalho.
fonte
rsync
para remover diretórios não parece certo e sempre há perigorm -rf
. Eu recomendo o 2º passo de ser:find source/ -d -type d -exec rmdir {} \;
-delete
e--remove-source-files
em um único comando rsync (os exemplos acima são bons, isso é tangencial). Se você interromper e executar novamente o que estou descrevendo, você perderá os arquivos transferidos. O que eu fiz antes :(find
, prefiro o seguinte:find source/ -type d -empty -delete
isso me dá uma estranha sensação de segurança de que isso não vai prejudicar tudo.Do comentário de zany à resposta do slm ( Mover arquivos e excluir diretórios com o rsync? ) Eu recomendaria estes 2 comandos como resposta:
A vantagem é que, como Zany disse, ainda há algum perigo envolvido no uso de rm -rf se você não acertar ou para iniciantes.
Adicionei 2 opções, -thth e -vazty e, embora não tenha certeza se isso é realmente necessário, ele torna o segundo comando mais portátil para outras situações e ainda mais seguro (ainda faz a coisa certa se alguns diretórios não estiverem vazios e começa a remover do ponto mais profundo de uma árvore de diretórios)
fonte
-delete
vez de-exec rmdir {} \;
?Isso faz o trabalho em uma etapa. Observe a trilha / barra / nos caminhos de origem e destino.
Repito a advertência do user7000 de não usar
--delete
e--remove-source-files
juntos na mesma chamada pararsync
. Se a operação falhar ou for interrompida e a mesma chamada for repetida, você perderá dados. Em caso de dúvida, use a--dry-run
opção para ver o que seria feito.fonte
-ruval
parece redundante.-a
é equivalente a-rlptgoD
, que inclui ambos-r
e-l
.