Ich verwende das folgende Bash-Skript, um nur Dateien mit einer bestimmten Erweiterung (in diesem Fall * .sh) zu kopieren, es kopiert jedoch immer noch alle Dateien. Was ist los mit dir?
von = $ 1 bis = $ 2 rsync -zarv --include = "*. sh" $ von $ bis
rsync
, dies kann sehr gut mit den Shell-Interna erreicht werden?Antworten:
Ich denke,
--include
wird verwendet, um eine Teilmenge von Dateien einzuschließen, die ansonsten von ausgeschlossen werden--exclude
, anstatt nur diese Dateien einzuschließen. Mit anderen Worten: Sie müssen über die Einschlussbedeutung nachdenken, die Sie nicht ausschließen .Versuchen Sie stattdessen:
Für rsync Version 3.0.6 oder höher muss die Reihenfolge wie folgt geändert werden (siehe Kommentare):
Durch Hinzufügen des
-m
Flags 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 ausschließen
--exclude="*"
, alle Verzeichnisse--include="*/"
einschließen und alle * .sh-Dateien einschließen--include="*.sh"
.Einige gute Beispiele finden Sie im Abschnitt Musterregeln ein- / ausschließen der Manpage
quelle
rsync -zarv --include="*/" --include="*.sh" --exclude="*" "$from" "$to"
.--include=\*.sh
dann--exclude=\*
)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
quelle
Noch eine Ergänzung: Wenn Sie Dateien anhand ihrer Erweiterungen nur in einem Verzeichnis (ohne Rekursion) synchronisieren müssen, sollten Sie eine Konstruktion wie die folgende verwenden:
Achten Sie auf den Punkt im ersten
--include
.--no-r
funktioniert in dieser Konstruktion nicht.BEARBEITEN:
Vielen Dank an gbyte.co für den wertvollen Kommentar!
quelle
include
und dieexclude
Optionen in der Reihenfolge verwendet, in der sie angegeben wurden. Außerdem wird der erste übereinstimmende angehalten. Wenn wir also--exclude '*'
in diesem Beispiel an erster Stelle das angeben, wird rsync nichts tun. Siehe den Mann für weitere Erklärungen.-- include './'
lautet: Alles in den Quellverzeichnispfad aufnehmen? Dann schließt das nächste `--include '.ext'` die spezifische Datei in den genannten Quellpfad ein.ext
und dann sagt das exclude, dass Sie nichts anderes senden--exclude '*'
? Ist das korrekt?--include '*.ext'
und nicht--include '.ext'
Hier ist der wichtige Teil der Manpage:
Zusammenfassen:
Etwas, das mit einem Schrägstrich endet, stimmt auch mit Verzeichnissen überein (wie z
find -type d
wäre).Lassen Sie uns diese Antwort von oben auseinander ziehen.
.sh
DateienSchließlich verhindert
--prune-empty-directories
die erste Regel, dass überall leere Verzeichnisse erstellt werden.quelle
Wenn jemand danach sucht ... Ich wollte nur bestimmte Dateien und Ordner rsyncieren und habe es mit diesem Befehl geschafft:
rsync --include-from=rsync-files
Mit rsync-Dateien:
quelle
Schrieb diese praktische Funktion und fügte meine Bash-Skripte oder ein
~/.bash_aliases
. Lokale Synchronisierung unter Linux mit Bash getestet undawk
installiert. Es klapptVorteile:
kurz handlich und erweiterbar, wenn man mehr Argumente hinzufügen möchte (dh
--dry-run
).Beispiel:
quelle