it-swarm.com.de

rsync kopiert nur bestimmte Dateitypen mit der Option include

Ich verwende das folgende Bash-Skript, um nur Dateien mit einer bestimmten Erweiterung (in diesem Fall * .sh) zu kopieren. Es kopiert jedoch weiterhin alle Dateien. was ist falsch?

 von = $ 1 
 bis = $ 2 
 
 rsync -zarv - include = "*. sh" $ von $ bis 
76
user881480

Ich denke, --include Wird verwendet, um eine Teilmenge von Dateien einzuschließen, die ansonsten von --exclude Ausgeschlossen werden, anstatt nur diese Dateien einzuschließen. Mit anderen Worten: Sie müssen sich Gedanken machen über include Bedeutung nicht ausschließen .

Versuchen Sie stattdessen:

rsync -zarv  --include "*/" --exclude="*" --include="*.sh" "$from" "$to"

Für rsync Version 3.0.6 oder höher muss die Reihenfolge wie folgt geändert werden (siehe Kommentare):

rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"

Durch Hinzufügen des Flags -m Wird vermieden, dass leere Verzeichnisstrukturen im Ziel erstellt werden. Getestet in Version 3.1.2.

Wenn wir also nur * .sh-Dateien wollen, müssen wir alle Dateien --exclude="*" Ausschließen, alle Verzeichnisse --include="*/" Und alle * .sh-Dateien --include="*.sh" Einschließen.

Einige gute Beispiele finden Sie im Abschnitt Musterregeln einschließen/ausschließen der Manpage

133
chepner

Die Antwort von @chepner kopiert alle Unterverzeichnisse, unabhängig davon, ob sie die Datei enthalten oder nicht. Wenn Sie die Unterverzeichnisse ausschließen müssen, die die Datei nicht enthalten und dennoch die Verzeichnisstruktur beibehalten, verwenden Sie

rsync -zarv  --Prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
40
WanderingMind

Ein weiterer Zusatz: Wenn Sie Dateien nach ihren Erweiterungen in nur ein Verzeichnis (ohne Rekursion) synchronisieren müssen, sollten Sie eine Konstruktion wie die folgende verwenden:

rsync -auzv --include './' --include '.ext' --exclude '*' /source/dir/ /destination/dir/

Achten Sie auf den Punkt im ersten --include. --no-r funktioniert bei dieser Konstruktion nicht.

13
Serge Roussak

Hier ist der wichtige Teil der Manpage:

Während die Liste der zu übertragenden Dateien/Verzeichnisse erstellt wird, vergleicht rsync die zu übertragenden Namen der Reihe nach mit der Liste der Einschluss-/Ausschlussmuster, und das erste übereinstimmende Muster wird berücksichtigt: Wenn es sich um ein Ausschlussmuster handelt, ist dies die Datei übersprungen; Wenn es sich um ein Include-Muster handelt, wird dieser Dateiname nicht übersprungen. Wird kein passendes Muster gefunden, wird der Dateiname nicht übersprungen.

Zusammenfassen:

  • Wenn kein Muster gefunden wird, wird eine Datei kopiert!
  • Der Algorithmus wird beendet, sobald ein Muster übereinstimmt

Etwas, das mit einem Schrägstrich endet, stimmt auch mit Verzeichnissen überein (z. B. find -type d würde).

Lassen Sie uns diese Antwort von oben auseinander ziehen.

rsync -zarv  --Prune-empty-dirs --include "*/"  --include="*.sh" --exclude="*" "$from" "$to"
  1. Überspringe keine Verzeichnisse
  2. Überspringe kein .sh Dateien
  3. Überspringe alles
  4. (Überspringen Sie implizit nichts, aber die obige Regel verhindert, dass die Standardregel jemals auftritt.)

Endlich, das --Prune-empty-directories verhindert, dass die erste Regel überall leere Verzeichnisse erstellt.

6
Jim Hunziker