rsync nur vorhandene Unterverzeichnisse im Ziel

rsync nur vorhandene Unterverzeichnisse im Ziel

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 --deletees hinzu, rsyncwenn Sie möchten, dass Dateien im Ziel entfernt werden, wenn sie in der Quelle nicht mehr vorhanden sind.

Antwort2

Erstellen Sie das folgende bashSkript, ä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.rulesDadurch 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 rsyncmithilfe eines Merge-Filters erneut für die Verzeichnisse aus.

Antwort3

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

verwandte Informationen