Vor kurzem musste ich eine große Anzahl von Dateien löschen (über 1 Million) und habe Folgendes gelesen:
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
War eine der optimiertesten Möglichkeiten, das zu tun, und ich kann dafür bürgen, dass es schneller ist als rm -rf
.
Ich bin kein Experte auf diesem Gebiet, aber nach meinem Verständnis hat der Grund für die Leistung von rsync etwas mit der Art und Weise zu tun, wie Dateien aufgelistet werden (LIFO anstelle von FIFO, nehme ich an). Das Problem ist nun, dass ich auch eine große Anzahl von Dateien auf effiziente Weise verschieben muss. Nach einigem Suchen fand ich Folgendes:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination
Während dies alle verschobenen Dateien in löscht ~/source
, bleiben die Verzeichnisse dort. Da ich eine "Round-Robin" -ähnliche Verzeichnisstruktur habe, liegt die Anzahl von files/directories
sehr nahe bei 1, so dass ich gezwungen bin, den ersten Befehl erneut auszuführen, um das Verzeichnis vollständig zu entfernen:
rsync -av --ignore-existing --remove-source-files ~/source ~/destination && \
rsync -av --delete `mktemp -d`/ ~/source && rmdir ~/source
Ein Straight mv
würde praktisch sofort beendet, aber mein ~/destination
Verzeichnis enthält Dateien, die aufbewahrt werden sollten, daher mv
ist dies keine Option. Ich habe die Optionen --prune-empty-dirs
und --force
rsync gefunden, aber keine scheint wie erwartet zu funktionieren:
--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)
Gibt es eine Möglichkeit, einen Schritt mit rsync auf einmal nachzuahmen ?
Antworten:
Ich fand diesen Thread im Stackoverflow mit dem Titel: Löschen von Ordnern mit rsync "move"? , die im Wesentlichen die gleiche Frage stellt. Eine der Antworten schlug vor, die
rsync
in 2-Befehle auszuführen, da anscheinend kein einziger Befehl vorhanden ist, der das Verschieben / Entfernen der Dateien und der Quellverzeichnisse ausführen kann.Alternativ können Sie diesen Befehl verwenden:
Nicht ideal, aber macht den Job.
quelle
rsync
Prune Verzeichnisse fühlt sich nicht richtig und es gibt immer die Gefahr mitrm -rf
. Ich würde den 2. Schritt empfehlen:find source/ -d -type d -exec rmdir {} \;
-delete
und--remove-source-files
in einem einzigen Befehl rsync (die obigen Beispiele sind in Ordnung, das ist tangential). Wenn Sie unterbrechen und dann erneut ausführen, was ich beschreibe, gehen die übertragenen Dateien verloren. Was ich schon gemacht habe :(find
bevorzugefind source/ -type d -empty -delete
ich Folgendes : Es gibt mir ein seltsames Gefühl der Gewissheit, dass es nicht einfach alles kaputt macht.Vom Kommentar von zany zur Antwort von slm ( Dateien verschieben und Verzeichnisse mit rsync löschen? ) Ich würde diese 2 Befehle als Antwort empfehlen:
Der Vorteil ist, wie zany schon sagte, dass die Verwendung von rm -rf immer noch eine gewisse Gefahr birgt, wenn Sie es nicht richtig machen oder für Anfänger.
Ich habe 2 Optionen hinzugefügt, -depth und -empty, und obwohl ich nicht sicher bin, ob dies wirklich notwendig ist, macht es den 2. Befehl für andere Situationen portabler und sogar sicherer (es macht immer noch das Richtige, wenn einige Verzeichnisse nicht leer sind und beginnt vom tiefsten Punkt in einem Verzeichnisbaum zu entfernen)
quelle
-delete
statt-exec rmdir {} \;
?Dies erledigt die Arbeit in einem Schritt. Beachten Sie den abschließenden / Schrägstrich / sowohl auf dem Quell- als auch auf dem Zielpfad.
Ich wiederhole die Warnung von user7000, nicht zu benutzen
--delete
und--remove-source-files
gemeinsam im selben Anruf zu tätigenrsync
. Wenn der Vorgang fehlschlägt oder unterbrochen wird und derselbe Anruf wiederholt wird, gehen Daten verloren. Wenn in jedem Zweifel, verwenden Sie die--dry-run
Option , um zu sehen , was getan werden würde.quelle
-ruval
scheint überflüssig.-a
ist gleichbedeutend mit-rlptgoD
, was sowohl-r
als auch enthält-l
.