Wie lösche ich leere Quellverzeichnisse, wenn ich Ordner mit rsync verschiebe?


8

rsynckann mvmit den folgenden Optionen sehr ähnlich und überlegen zu herkömmlichen Ordnern in verschiebbare Ordner gebracht werden :

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

Eine Sache, die ich noch nicht zu tun scheint, ist das Entfernen der ursprünglichen Verzeichnisse. Das --remove-source-filesFlag macht genau das, entfernt die Quelldateien, aber nicht auch die Quellverzeichnisse. Ich wünschte, es gäbe auch eine --remove-source-directoriesFlagge, aber es gibt keine.

Wie kann ich damit umgehen? Ich nehme an, ich kann nur eine rm -frnach dem Umzug ausstellen , aber ich würde es vorziehen, das Verfahren in einem Prozess beizubehalten, anstatt ein Fehlerpotential einzuführen.


Was ist Ihr Grund für die Nichtverwendung mv?
Nils

1
Verschiedene Volumes und ich müssen alle Attribute, einschließlich der Zeiten, beibehalten.
ylluminate


1
Ich bin sehr überrascht, dass rsync keine Option dafür hat, besonders wenn dies auf der Zielseite der Fall ist. find . -type d -empty | xargs rmdir -p
Am

Sie wissen, @ Sridhar-Sarnobat Ich kann nicht anders, als mich zu fragen, ob es eine Möglichkeit gibt, Ergebnisse einer rsyncSitzung in eine Liste zu übertragen, die dann nach dem Prozess verarbeitet wird, der sie dann bereinigt ... Hmm.
ylluminate

Antworten:


4

Ich habe keinen Befehl gefunden, der dies auf einmal erledigt, aber da rsync immer noch eine bessere Leistung aufweist als rm -rf(insbesondere wenn Sie eine sehr große Anzahl von Verzeichnissen haben), gibt es zwei rsync-Befehle, die einen "Verschieben" ausführen :

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

5

Die Verwendung von " rm -rf " hat eine inhärente Race-Bedingung. Sie können nämlich Dateien löschen, die gerade zwischen dem rsync- und dem rm- Aufruf erstellt wurden.

Ich bevorzuge:

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

Dadurch werden die Verzeichnisse NICHT entfernt, wenn sie nicht leer sind.


Beachten Sie, dass Sie möglicherweise -depthOSX oder andere hinzufügen müssen .
Charlie Gorichanaz

3

Ich bin in eine ähnliche Situation geraten. Ich wollte vermeiden rm -rf, weil ich wusste, dass rsync einige Dateien nicht kopieren konnte, und ich wollte sie nicht verlieren.

Um die leeren Verzeichnisse einfach zu löschen, fand ich dieses am bequemsten (von sourcedir):

find . -type d -empty -delete

Ja, Gott sei Dank für -leer, was ich erst kürzlich herausgefunden habe und es für mich sehr üblich geworden ist, es zu benutzen.
Sridhar Sarnobat

2

Warum nicht einfach rm -rf source_directorynach Ihrem rsync hinzufügen ?

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

Jedes Befehlszeilenprogramm ist (idealerweise) für eine bestimmte Aufgabe ausgelegt, und es liegt an Ihnen, mehrere zusammenzufügen, um komplexere Aufgaben zu erledigen.


2
Ich denke, du hast recht. Ich glaube, ich muss letztendlich auch zuerst nach unten bohren, da ich nicht erwischt werden kann, wenn ich mich nur so bewege, wie es rsync normalerweise tut. Müssen wahrscheinlich verwenden find -depth. Hätten Sie einen Vorschlag für einen schnellen algorithmischen Ansatz, um auf den Grund des Verzeichnisstapels zu gelangen, mit rsync zu arbeiten, wie Sie bemerken, rm'ing und dann wieder auf den Baum zu treten?
ylluminate
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.