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?