J'utilise rsync pour extraire des fichiers essentiels d'un serveur, puis les supprime du serveur une fois que je les ai localement. La commande complète que je lance est ci-dessous.
Ceci supprime avec succès les fichiers sur le serveur source, mais les répertoires vides restent toujours. Je ne reçois aucun message ou erreur. Toutes les sorties sont normales. Peut-être que c'est 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.
Le comportement de --remove-source-files
que vous observez est exactement celui spécifié par man rsync
:
--remove-source-files
This tells rsync to remove from the sending side the files (meaning non-directories) that are a part of the transfer and have been successfully duplicated on the receiving side.
Il n'y a pas de commande spécifique pour supprimer les répertoires, comme ces deux discussions dans StackExchange et ServerFault montre clairement. La solution suggérée consiste à émettre deux commandes distinctes:
rsync -av --ignore-existing --remove-source-files source/ destination/ && \
rsync -av --delete `mktemp -d`/ source/
Le dernier morceau de la commande suggéré dans ces deux messages,
rmdir source/
ce qui est nécessaire pour supprimer le répertoire source (maintenant vidé) a ce formulaire dans ces publications, car les PO et les réponses utilisent rsync pour déplacer de grandes quantités de fichiers sur le même ordinateur. Dans votre cas, vous devrez le faire manuellement.
La page de manuel dit même:
--remove-source-files sender removes synchronized files (non-dirs)
Si vous souhaitez supprimer les répertoires vides de votre source, s'il reste des fichiers, procédez comme suit:
find . -depth -type d -empty -delete
Mais pour un répertoire racine vide, un rm -rf <directory>
suffira bien sûr.
L'utilisation de " rm -rf " comporte une condition de concurrence inhérente. Vous pouvez notamment supprimer les fichiers qui viennent d'être créés entre le . rsync et les invocations rm .
Je préfère utiliser:
rsync --remove-source-files -a serveur: entrant/entrant/&&
serveur ssh trouver -type entrant -delete
Cela ne supprimera PAS les répertoires s'ils ne sont pas vides.
-m, --Prune-empty-dirs
Élaguer les chaînes de répertoires vides de la liste de fichiers
--force
force la suppression des répertoires même si elle n'est pas vide
Supprimez les fichiers source, puis supprimez les répertoires pour plus de sécurité.
# given this scenario where you generate folders 2014-01-01 etc.. that have an archive myfile.tar.gz
pushd $(mktemp -d)
mkdir 201{4..6}-{01..12}-{01..31}
for i in $(ls); do; touch $i/myfile.tar.gz;done;
# find and rsync on 10 CPU threads directories that match ./2015-*
find /tmp/tmp.yjDyF1jN70/src -type d -name '2015-*' | \
parallel \
--jobs 10 \
--progress \
--eta \
--round-robin \
rsync \
--hard-links \
--archive --verbose --protect-args \
--remove-source-files \
{} /tmp/tmp.yjDyF1jN70/dest
# now safely remove empty directories only
for i in $(ls /tmp/tmp.yjDyF1jN70/src); do; rmdir /tmp/tmp.yjDyF1jN70/src/$i; done;
Plus sur GNU parallèle