J'utilise rsync pour récupérer des fichiers essentiels sur un serveur, puis supprimer les fichiers du serveur une fois que je les ai localement. La commande complète que j'exécute est ci-dessous.
Cela supprime correctement les fichiers sur le serveur source, mais des répertoires vides restent toujours. Je ne reçois aucun message ni erreur. Toute sortie est normale. C'est peut-être la fonctionnalité prévue.
Comment puis-je dire à rsync de tout nettoyer, y compris les répertoires?
rsync --progress -vrzh --remove-source-files
La version est 3.0.9 aux deux extrémités.
Réponses:
Le comportement
--remove-source-files
que vous observez est exactement celui spécifié parman rsync
:Il n'y a pas de commande spécifique pour supprimer les répertoires, comme le montrent clairement ces deux discussions dans StackExchange et ServerFault . La solution suggérée consiste à émettre deux commandes distinctes:
Le dernier morceau de la commande suggéré dans ces deux messages,
qui est nécessaire pour supprimer le répertoire source (maintenant vidé) a ce formulaire dans ces messages parce que les OP et les réponses utilisent rsync pour déplacer de grandes quantités de fichiers sur la même machine. Dans votre cas, vous devrez le faire manuellement.
la source
rsync --delete
suggestion est dangereuse, car elle ignore la possibilité que la rsync ne soit pas terminée ou qu'il y ait de nouveaux fichiers à la source. Lafind
méthode de @ slhck ci-dessous est beaucoup plus sûre.La page de manuel dit même:
Si vous souhaitez supprimer des répertoires vides de votre source, s'il reste des fichiers, procédez comme suit:
Mais pour un répertoire racine vide, une
rm -rf <directory>
volonté suffit bien sûr.la source
find some_dir -depth -type d -empty -not -path some_dir -delete
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:
Cela ne supprimera PAS les répertoires s'ils ne sont pas vides.
la source
rm -rf
va également supprimer des fichiers qui ne sont pas transférés pour une raison quelconque.-depth
option qui demandefind
de traiter dans le bon ordre. À la suite de cette erreur, les répertoires qui ne contiennent que des répertoires vides (éventuellement récursivement) ne seront pas supprimés. La variante de @slhck a raison.-m, --prune-empty-dirs
élaguer les chaînes de répertoires vides de la liste de fichiers--force
forcer la suppression des répertoires même s'ils ne sont pas videsla source
Supprimez les fichiers source, puis supprimez les répertoires pour être sûr.
la source