Mover arquivos e excluir diretórios com rsync?

17

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?

    
por Alix Axel 05.06.2013 / 21:46

3 respostas

7

Encontrei este tópico no stackoverflow intitulado: Excluindo pastas com o rsync “move”? , que está fazendo basicamente a mesma pergunta. Uma das respostas sugeriu fazer os comandos rsync in 2, já que parece que não há um único comando que possa realizar a movimentação / remoção dos arquivos e dos diretórios de origem.

$ rsync -av --ignore-existing --remove-source-files source/ destination/ && \
  rsync -av --delete 'mktemp -d'/ source/ && rmdir source/

Alternativamente, você pode fazer isso usando este comando:

$ rsync -axvvES --remove-source-files source_directory /destination/ && \
  rm -rf source_directory

Não é ideal, mas faz o trabalho.

    
por 29.06.2013 / 02:32
10

Do comentário de zany à resposta de slm ( Mover arquivos e excluir diretórios com rsync? ) Eu recomendaria esses 2 comandos como resposta:

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
find source/ -depth -type d  -empty -exec rmdir "{}" \;

A vantagem é que, como zany disse, ainda há algum perigo envolvido no uso de rm-rf se você não acertar ou para iniciantes.

Eu adicionei 2 opções, -depth e -empty e, embora eu 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 são não está vazio e começa a remover do ponto mais profundo de uma árvore de diretórios)

    
por 11.01.2015 / 14:14
1

Isso faz o trabalho em uma etapa. Observe o rastro / barra / nos caminhos de origem e de destino.

rsync \
    -ruval \
    --ignore-existing \
    --remove-source-files \
    --prune-empty-dirs \ 
    /source/path/ /target/path/

Faço eco do aviso do user7000 de não usar --delete e --remove-source-files juntos na mesma chamada para rsync . Se a operação falhar ou for interrompida e a mesma chamada for repetida, você perderá dados. Se em qualquer dúvida, use a opção --dry-run para ver o que seria feito.

    
por 12.03.2018 / 07:41