Comment supprimer des répertoires sources vides lors du déplacement de dossiers avec rsync?

8

rsyncpeut être amené dans des dossiers mobiles de manière très similaire et supérieure à la traditionnelle mvavec les options suivantes:

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

Cependant, une chose que je n'arrive pas encore à faire est de supprimer les répertoires d'origine. Le --remove-source-filesdrapeau fait juste cela, supprime les fichiers source, mais pas aussi les répertoires source. J'aurais aimé qu'il y ait aussi un --remove-source-directoriesdrapeau, mais il n'y en a pas.

Comment puis-je gérer cela? Je suppose que je peux simplement émettre un rm -fraprès le déménagement, mais je préférerais garder la procédure tout en un seul processus par rapport à l'introduction d'un potentiel d'erreurs.

ylluminate
la source
Quelle est votre raison de ne pas l'utiliser mv?
Nils
1
Différents volumes et je dois préserver tous les attributs, y compris les temps.
ylluminate
1
Même besoin ici unix.stackexchange.com/q/78375/3858 .
Alix Axel
1
Je suis très surpris que rsync n'ait pas d'option pour cela, surtout quand il le fait du côté destination. Je find . -type d -empty | xargs rmdir -p
finis
Vous savez @ Sridhar-Sarnobat Je ne peux pas m'empêcher de me demander s'il existe un moyen de passer les résultats d'une rsyncsession dans une liste qui est ensuite traitée en suivant le processus qui la nettoie ensuite ... Hmm.
éclairer

Réponses:

4

Je n'ai pas trouvé de commande qui fait cela en une seule fois, mais puisque rsync fonctionne toujours mieux que rm -rf(spécialement si vous avez un très grand nombre de répertoires), voici deux commandes rsync qui font un "déplacement" :

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

L'utilisation de " rm -rf " a une condition de concurrence inhérente, vous pouvez notamment supprimer les fichiers qui viennent d'être créés entre les appels rsync et rm .

Je préfère utiliser:

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

Cela ne supprimera PAS les répertoires s'ils ne sont pas vides.

Raúl Salinas-Monteagudo
la source
Notez que vous devrez peut-être apparemment ajouter -depthsur OSX ou autres.
Charlie Gorichanaz
3

Je me suis retrouvé dans une situation similaire. Je voulais éviter rm -rf, sachant que rsync n'a pas réussi à copier certains fichiers, et je ne voulais pas les perdre.

Pour supprimer simplement les répertoires vides, j'ai trouvé celui-ci le plus pratique (de sourcedir):

find . -type d -empty -delete
lp_
la source
Oui, Dieu merci pour -vide, que je n'ai découvert que récemment et il est devenu très courant pour moi d'utiliser.
Sridhar Sarnobat
2

Pourquoi ne pas simplement ajouter rm -rf source_directoryaprès votre rsync?

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

Chaque programme de ligne de commande est (idéalement) conçu pour effectuer une tâche spécifiée, et c'est à vous d'en coller plusieurs pour accomplir des tâches plus complexes.

Gregory MOUSSAT
la source
2
Je pense que tu as raison. Je crois que je dois finalement forer vers le bas aussi bien en premier car je ne peux pas me faire prendre juste en bougeant comme le fait normalement rsync. Besoin probablement d'utiliser find -depth. Auriez-vous une suggestion quant à une approche algorithmique rapide pour descendre au bas de la pile de dir, mv'ing avec rsync, rm'ing comme vous le notez, puis remonter dans l'arborescence?
ylluminate