Como excluir diretórios de origem vazios ao mover pastas com o rsync?

8

rsyncpode ser convencido a mover pastas de maneira muito semelhante e superior à tradicional, mvcom as seguintes opções:

rsync -axvvES --remove-source-files source_directory /destination/

No entanto, uma coisa que ainda não consigo fazer é remover os diretórios originais. A --remove-source-filesbandeira faz exatamente isso, remove os arquivos de origem, mas não também diretórios de origem. Eu gostaria que houvesse uma --remove-source-directoriesbandeira também, mas não há.

Como posso lidar com isso? Suponho que posso apenas emitir um rm -frapós a mudança, no entanto, eu preferiria manter o procedimento todo em um processo versus introduzir um potencial de erros.

iluminar
fonte
Qual é o seu motivo para não usar mv?
Nils
1
Volumes diferentes e preciso preservar todos os atributos, incluindo horários.
usar o seguinte código
1
A mesma necessidade aqui unix.stackexchange.com/q/78375/3858 .
Alix Axel
1
Estou muito surpreso que o rsync não tem opção para isso, especialmente quando o faz no lado do destino. Eu acabo fazendofind . -type d -empty | xargs rmdir -p
Sridhar Sarnobat
Você sabe @ Sridhar-Sarnobat, não posso deixar de me perguntar se há uma maneira de passar os resultados de uma rsyncsessão para uma lista que é então processada após o processo que a limpa ... Hummm.
ilumina

Respostas:

4

Eu não encontrei um comando que faça isso de uma só vez, mas como o rsync ainda tem um desempenho melhor do que rm -rf(especialmente se você tiver um número muito grande de diretórios), aqui estão dois comandos do rsync que fazem um "movimento" :

rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/ && rmdir source/
Alix Axel
fonte
5

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:

rsync --remove-source-files -a server:incoming/ incoming/ && 
ssh server find incoming -type d -delete

Isso NÃO removerá os diretórios se eles não estiverem vazios.

Raúl Salinas-Monteagudo
fonte
Observe que você pode precisar adicionar o -depthOSX ou outros.
Charlie Gorichanaz
3

Acabei em uma situação semelhante. Eu queria evitar rm -rf, sabendo que o rsync falhou ao copiar alguns arquivos e não queria perdê-los.

Para simplesmente excluir os diretórios vazios, achei este o mais conveniente (de sourcedir):

find . -type d -empty -delete
lp_
fonte
Sim, graças a Deus por -vazio, que eu descobri recentemente e se tornou muito comum eu usar.
Sridhar Sarnobat 26/08/19
2

Por que não adicionar apenas rm -rf source_directoryapós o seu rsync?

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

Cada programa de linha de comando é feito (idealmente) para executar uma tarefa especificada, e cabe a você colar vários para realizar tarefas mais complexas.

Gregory MOUSSAT
fonte
2
Eu acho que você está certo. Acredito que, em última análise, tenho que me aprofundar até o fim, pois não consigo ser pego apenas movendo-se da maneira que o rsync normalmente faz. Provavelmente precisa usar find -depth. Você tem alguma sugestão sobre uma abordagem algorítmica rápida para chegar ao fundo da pilha de diretórios, movendo-se com rsync, movendo-se como você observa e depois voltando para a árvore?
usar o seguinte comando