it-swarm.com.de

RSYNC löscht keine Quellverzeichnisse

Ich verwende Rsync, um wichtige Dateien von einem Server abzurufen, und lösche die Dateien dann vom Server, sobald ich sie lokal habe. Der vollständige Befehl, den ich ausführe, ist unten.

Dadurch werden die Dateien auf dem Quellserver erfolgreich gelöscht, es verbleiben jedoch noch leere Verzeichnisse. Ich erhalte keine Nachrichten oder Fehler. Alle Ausgaben sind normal. Vielleicht ist dies die beabsichtigte Funktionalität.

Wie kann ich rsync anweisen, alles einschließlich der Verzeichnisse zu bereinigen?

rsync --progress -vrzh --remove-source-files

Version ist 3.0.9 an beiden Enden.

26
Sajan Parikh

Das Verhalten von --remove-source-files, das Sie beobachten, ist genau das, das durch man rsync angegeben wird:

--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.

Es gibt keinen speziellen Befehl zum Entfernen der Verzeichnisse, wie diese beiden Diskussionen in StackExchange und ServerFault deutlich zeigen. Die dort vorgeschlagene Lösung besteht darin, zwei separate Befehle auszugeben:

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

Das letzte Stück des Befehls in diesen beiden Beiträgen vorgeschlagen,

 rmdir source/

das zum Entfernen des (jetzt geleerten) Quellverzeichnisses erforderliche Formular befindet sich in diesen Posts, da die OPs und die Antworten rsync verwenden, um große Mengen von Dateien auf demselben Computer zu verschieben. In Ihrem Fall müssen Sie dies manuell tun.

13
MariusMatutiae

Die Manpage sagt sogar:

--remove-source-files   sender removes synchronized files (non-dirs)

Wenn Sie leere Verzeichnisse in Ihrer Quelle entfernen möchten und noch Dateien übrig sind, gehen Sie wie folgt vor:

find . -depth -type d -empty -delete

Aber für ein leeres Stammverzeichnis reicht natürlich ein rm -rf <directory> aus.

30
slhck

Mit " rm -rf " können Sie nämlich Dateien löschen, die gerade zwischen dem rsync und die rm Aufrufe.

Ich bevorzuge zu verwenden:

rsync --remove-source-files -a server: Posteingang/Posteingang/&&

sSH-Server finden eingehende-Typ d -delete

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

-m, --Prune-empty-dirs Leere Verzeichnisketten aus der Dateiliste entfernen

--force Löschung von Verzeichnissen erzwingen, auch wenn diese nicht leer sind

1
MarcoP

Entfernen Sie die Quelldateien und anschließend aus Sicherheitsgründen die Verzeichnisse.

# 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;

Mehr zu GNU Parallel