
Ich habe zwei Verzeichnisse, bei denen ich per Rsync nur die Inhalte der Unterverzeichnisse synchronisieren muss, die bereits im Zielverzeichnis vorhanden sind. Beispiel:
Quellverzeichnis:
- Ordner A
- Ordner B
- Ordner C
- Ordner D
- Ordner E
Zielverzeichnis:
- Ordner B
- Ordner D
- Ordner Z
Ich muss nur den Inhalt der Ordner B und D von der Quelle zum Ziel synchronisieren (und Ordner Z existiert in der Quelle nicht, also sollte er ignoriert werden). Ebenso brauche ich kein Zielverzeichnis, in das die Ordner A, C und E kopiert werden.
Im Wesentlichen ein „Für alle Unterverzeichnisse im Ziel: Wenn das gleiche Unterverzeichnis in der Quelle vorhanden ist, synchronisieren Sie den Inhalt dieses Unterverzeichnisses mit rsync aus der Quelle.“
Falls es hilft: Dies sind alles lokale Verzeichnisse.
Hoffentlich ergibt das Sinn. Vielen Dank für die Hilfe!
Antwort1
Sie könnten ein Skript wie dieses verwenden.
(
cd destination &&
for d in *
do
[ -d "$d" -a -d source/"$d" ] && rsync -a source/"$d" .
done
)
Wenn es eigenständig ist, brauchen Sie die Klammern nicht, ( ... )
da sie nur dazu dienen, den Verzeichniswechsel zu lokalisieren.
Fügen Sie --delete
es hinzu, rsync
wenn Sie möchten, dass Dateien im Ziel entfernt werden, wenn sie in der Quelle nicht mehr vorhanden sind.
Antwort2
Erstellen Sie das folgende bash
Skript, ändern Sie die Pfade zum Quell- und Zielverzeichnis und führen Sie es aus.
#!/bin/bash
source=/path_to/source_dir
destination=/path_to/destination_dir
shopt -s nullglob
{
for dir in "$destination/"*/; do
dirname=$(basename "$dir")
if [ -d "$source/$dirname" ]; then
printf '+ /%s/***\n' "$dirname"
fi
done
printf -- '- *\n'
} > "$source/filter.rules"
#rsync -av --filter="merge $source/filter.rules" "$source"/ "$destination"
filter.rules
Dadurch würde im Quellverzeichnis eine Datei mit folgendem Inhalt erstellt :
+ /folder B/***
+ /folder D/***
- *
Die erste Zeile + /folder B/***
ist die Kurzsyntax für
+ /folder B/
Verzeichnis einbinden+ /folder B/**
Dateien und Unterverzeichnisse einschließen
und - *
schließt Dateien und Verzeichnisse im Stammverzeichnis aus.
Wenn die Regeln wie erwartet aussehen, heben Sie die Kommentierung der letzten Zeile auf und führen Sie das Skript rsync
mithilfe eines Merge-Filters erneut für die Verzeichnisse aus.
Antwort3
Die --existing
Flagge ist das, wonach Sie suchen. Aus der Manpage:
--existing, --ignore-non-existing
This tells rsync to skip creating files (including
directories) that do not exist yet on the destination. If this option is combined
with the --ignore-existing option, no files will be updated (which can be useful
if all you want to do is delete extraneous files).
This option is a transfer rule, not an exclude, so it doesn’t affect the data that
goes into the file-lists, and thus it doesn’t affect deletions. It just limits
the files that the receiver requests to be transferred.