Wie kann man eine Datei per Rsync synchronisieren und überflüssige Dateien/Verzeichnisse am Ziel löschen?

Wie kann man eine Datei per Rsync synchronisieren und überflüssige Dateien/Verzeichnisse am Ziel löschen?

Bei der Verwendung rsync --files-from=$FILEmöchte ich alle Dateien und Verzeichnisse im Ziel löschen, die nicht in der Datei aufgeführt sind.

z.B

mkdir /tmp/sync
cd /tmp/sync
mkdir left right
touch left/only_left right/only_right
echo /tmp/sync/left/only_left > tosync
rsync \
  --dry-run \
  --itemize-changes \
  --files-from=/tmp/sync/tosync \
  --progress \
  --human-readable \
  --prune-empty-dirs \
  --delete-after \
  --inplace \
  / /tmp/sync/right/

Ausgänge

cd+++++++++ tmp/
cd+++++++++ tmp/sync/
cd+++++++++ tmp/sync/left/
>f+++++++++ tmp/sync/left/only_left

und find /tmp/sync/rightAusgänge

find right/
right/
right/only_right
right/tmp
right/tmp/sync
right/tmp/sync/left
right/tmp/sync/left/only_left

Ich erwarte jedoch, dass „only_right“ gelöscht wird, was aber nicht der Fall ist. Wie funktioniert das?

Antwort1

Beim rekursiven Vergleichen des Inhalts von Verzeichnissen löscht rsync nur Zieldateien.

Dann müssen die Dateien in „tosync“ relativ zum Quellverzeichnis sein.

Um das gewünschte Verhalten zu erzielen, funktioniert Folgendes, basierend auf Ihrem Beispiel:

echo 'only_left' > /tmp/sync/tosync

rsync --dry-run --itemize-changes \
--delete --recursive \
--include-from=/tmp/sync/tosync \
--exclude=* /tmp/sync/left/ /tmp/sync/right/

verwandte Informationen