Bei der Verwendung rsync --files-from=$FILE
mö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/right
Ausgä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/