Récemment, j'ai dû supprimer un grand nombre de fichiers (plus d'un million) et j'ai lu cela en faisant:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
C'était l'un des moyens les plus optimisés de 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 des performances de rsync a quelque chose à voir avec la façon dont il répertorie les fichiers (LIFO au lieu de FIFO, je suppose). Maintenant, le problème est que je dois également déplacer un grand nombre de fichiers 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 déplacés de fichiers dans ~/source
les répertoires restent là. Comme j'ai une structure de répertoires de type "round-robin", le nombre de files/directories
est très proche de 1, donc je suis obligé d'exécuter à nouveau la première commande pour se débarrasser entièrement du répertoire:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Une ligne droite mv
se terminerait presque instantanément, mais mon ~/destination
répertoire contient des fichiers qui devraient être conservés, ce mv
n'est donc pas une option. J'ai trouvé les options --prune-empty-dirs
et --force
rsync, mais aucune ne semble fonctionner comme je m'y attendais:
--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?
Réponses:
J'ai trouvé ce fil sur stackoverflow intitulé: Suppression de dossiers avec rsync "move"? , qui pose essentiellement la même question. L'une des réponses a suggéré de faire les
rsync
commandes in 2 car il semble qu'il n'y ait pas une seule commande qui puisse effectuer le déplacement / suppression des fichiers et des répertoires source.Alternativement, vous pouvez le faire en utilisant cette commande:
Pas idéal mais fait le boulot.
la source
rsync
de l'élagage des répertoires ne se sent pas bien et il y a toujours un danger avecrm -rf
. Je recommanderais que la 2ème étape soit:find source/ -d -type d -exec rmdir {} \;
-delete
et--remove-source-files
dans une seule commande rsync (les exemples ci-dessus sont très bien, c'est tangentiel). Si vous interrompez puis réexécutez ce que je décris, vous perdrez les fichiers transférés. Ce que j'ai fait auparavant :(find
, je préfère ceci:find source/ -type d -empty -delete
cela me donne une étrange assurance que cela ne fera pas que tout encombrer.Du commentaire loufoque à la réponse de slm ( Déplacer des fichiers et supprimer des répertoires avec rsync? ) Je recommanderais ces 2 commandes comme réponse:
L'avantage est, comme l'a dit Zany, qu'il y a toujours un danger à utiliser rm -rf si vous ne le faites pas bien ou pour les débutants.
J'ai ajouté 2 options, -depth et -empty et même si je ne sais pas si c'est vraiment nécessaire, cela rend la 2e commande plus portable pour d'autres situations et encore plus sûre (elle fait toujours la bonne chose si certains répertoires ne sont pas vides et commence à supprimer du point le plus profond d'une arborescence de répertoires)
la source
-delete
au lieu de-exec rmdir {} \;
?Cela fait le travail en une seule étape. Notez la fin / barre oblique / sur les chemins source et cible.
Je fais écho à la mise en garde de user7000 de ne pas utiliser
--delete
et--remove-source-files
ensemble dans le même appel àrsync
. Si l'opération échoue ou est interrompue et que le même appel est répété, vous perdrez des données. En cas de doute, utilisez l'--dry-run
option pour voir ce qui serait fait.la source
-ruval
semble redondant.-a
est équivalent à-rlptgoD
, qui comprend à la fois-r
et-l
.