Recentemente, precisei excluir um grande número de arquivos (mais de 1 milhão) e li o que estava acontecendo:
rsync -av --delete 'mktemp -d'/ ~/source && rmdir ~/source
Foi uma das maneiras mais otimizadas de fazer isso, e posso garantir que é mais rápido do que rm -rf
.
Eu não sou um especialista no assunto, mas pelo que entendi a razão para o desempenho do rsync tem algo a ver da maneira como ele 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 isso:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Enquanto isso exclui todos os arquivos movidos em ~/source
, os diretórios permanecem lá. Como eu tenho uma estrutura de diretórios parecida com "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 me livrar do diretório completamente:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete 'mktemp -d'/ ~/source && rmdir ~/source
Um mv
direto seria concluído praticamente instantaneamente, mas meu diretório ~/destination
tem arquivos que devem ser mantidos, portanto, mv
não é uma opção. Eu encontrei as opções --prune-empty-dirs
e --force
rsync, mas nenhuma delas parece funcionar como eu esperaria:
--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 um movimento com o rsync de uma só vez?