RSYNC Löscht keine Quellverzeichnisse

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

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

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

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

Version ist 3.0.9 an beiden Enden.

 28
Author: Sajan Parikh, 2013-11-16

5 answers

Das Verhalten von --remove-source-files, das Sie beobachten, ist genau das von 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.

Es gibt keinen spezifischen 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 auszuführen:

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

Der letzte Teil des Befehls, der in diesen beiden Beiträgen vorgeschlagen wurde,

 rmdir source/

Die benötigt wird, um die (jetzt leeres) Quellverzeichnis hat dieses Formular in diesen Beiträgen, 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.

 16
Author: MariusMatutiae,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-06-12 13:48:39

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 vorhanden sind, führen Sie Folgendes aus:

find . -depth -type d -empty -delete

Wenn es nur ein leeres Quellverzeichnis ist, genügt natürlich ein rmdir <directory>.

 34
Author: slhck,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2020-01-21 15:16:25

Wenn "rm-rf " eine inhärente Race-Bedingung hat, können Sie nämlich Dateien löschen, die gerade zwischen den Aufrufen rsync und rm erstellt wurden.

Ich benutze lieber:

Rsync --remove-source-files)- ein server:incoming/ incoming/ &&

Ssh server finden incoming-Typ d -delete

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

 6
Author: Raúl Salinas-Monteagudo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2015-03-24 16:38:39

-m, --prune-empty-dirs beschneiden Sie leere Verzeichnisketten aus der Dateiliste

--force erzwingen Sie das Löschen von Verzeichnissen, auch wenn sie nicht leer sind

 1
Author: MarcoP,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2016-08-30 09:12:40

Quelldateien entfernen, dann Verzeichnisse entfernen, um sicher zu sein.

# 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

 1
Author: Daniel Andrei Mincă,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2017-03-14 10:52:37