Déplacer des files et supprimer des directorys avec rsync?

Récemment, j'avais besoin de supprimer un grand nombre de files (plus d'un million) et j'ai lu cela:

rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source 

Était l'un des moyens les plus optimisés pour le faire, et je peux garantir que c'est plus rapide que rm -rf .

Je ne suis pas un expert en la matière, mais d'après ma compréhension, la raison de la performance de rsync a quelque chose à faire la façon dont il répertorie les files (LIFO au lieu de FIFO, je suppose). Maintenant, le problème est que j'ai aussi besoin de déplacer un grand nombre de files de manière efficace. Après avoir cherché un peu, j'ai trouvé ceci:

 rsync -av --ignore-existing --remove-source-files ~/source ~/destination 

Bien que cela supprime tous les files déplacés dans ~/source , les directorys y restnt. Puisque j'ai une structure de directorys "round-robin", le nombre de files/directories est très proche de 1, je suis donc obligé de répéter la première command pour supprimer complètement le directory:

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

Un mv droit finirait presque instantanément, mais mon directory ~/destination contient des files qui doivent être conservés, donc mv n'est pas une option. J'ai trouvé les --prune-empty-dirs et --force rsync, mais ni l'un ni l'autre ne semblent fonctionner comme je l'espère:

 --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-t-il un moyen d'imiter un mouvement avec rsync en une seule fois?

J'ai trouvé ce sujet sur stackoverflow intitulé: Suppression de dossiers avec rsync "move"? , qui pose essentiellement la même question. L'une des réponses suggérées de faire les commands rsync dans 2 puisqu'il apparaît qu'il n'y a pas une seule command qui peut accomplir le déplacement / suppression des files et des directorys source.

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

Vous pouvez également le faire en utilisant cette command:

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

Pas idéal mais fait le travail.

Du commentaire de zany à la réponse de slm ( Déplacer des files et supprimer des directorys avec rsync? ) Je reorderais ces 2 commands comme réponse:

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

L'avantage est, comme l'a dit Zany, qu'il y a toujours un danger à utiliser rm -rf si vous ne le faites pas correctement ou pour les débutants.

J'ai ajouté 2 options, -depth et -vide et bien que je ne sache pas si cela est vraiment nécessaire, la seconde command est plus portable pour d'autres situations et encore plus sécurisée (elle fait toujours la bonne chose si certains directorys ne sont pas vides commence à se retirer du point le plus profond d'une arborescence de directorys)