Hier ist meine "Lehre einer Person das Fischen bei"-Antwort:
Die Syntax von Rsync ist definitiv nicht intuitiv, aber es lohnt sich, sie zu verstehen.
- Verwenden Sie zuerst
-vvv
um die Debug-Informationen für rsync anzuzeigen.
$ rsync -nr -vvv --include="**/file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
[sender] hiding directory 1280000000 because of pattern *
[sender] hiding directory 1260000000 because of pattern *
[sender] hiding directory 1270000000 because of pattern *
Das Schlüsselkonzept hierbei ist, dass rsync die Einschluss-/Ausschlussmuster für jedes Verzeichnis rekursiv anwendet. Sobald der erste Einschluss/Ausschluss übereinstimmt, stoppt die Verarbeitung.
Das erste Verzeichnis, das es auswertet, ist /Storage/uploads
. Storage/uploads
hat 1280000000/, 1260000000/, 1270000000/
Verzeichnisse/Dateien. Keiner von ihnen stimmt mit file_11*.jpg
überein einschließen. Alle stimmen mit *
überein ausschließen. Sie werden also ausgeschlossen und rsync endet.
- Die Lösung besteht darin, alle Verzeichnisse (
*/
) Erste. Dann ist die erste dir-Komponente1260000000/, 1270000000/, 1280000000/
da sie mit*/
übereinstimmen . Die nächste dir-Komponente wird1260000000/
sein . In1260000000/
,file_11_00.jpg
stimmt mit--include="file_11*.jpg"
überein , ist also enthalten. Und so weiter.
$ rsync -nrv --include='*/' --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
./
1260000000/
1260000000/file_11_00.jpg
1260000000/file_11_01.jpg
1270000000/
1270000000/file_11_00.jpg
1270000000/file_11_01.jpg
1280000000/
1280000000/file_11_00.jpg
1280000000/file_11_01.jpg
https://download.samba.org/pub/rsync/rsync.1
Das Problem ist, dass --exclude="*"
besagt, dass (zum Beispiel) 1260000000/
ausgeschlossen werden soll Verzeichnis, also rsync
untersucht nie den Inhalt dieses Verzeichnisses, bemerkt also nie, dass das Verzeichnis Dateien enthält, die mit Ihrem --include
abgeglichen worden wären .
Ich denke, das, was Sie wollen, kommt am nächsten:
rsync -nrv --include="*/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(was alle Verzeichnisse und alle Dateien enthält, die mit file_11*.jpg
übereinstimmen , aber keine anderen Dateien) oder vielleicht das:
rsync -nrv --include="/[0-9][0-9][0-9]0000000/" --include="file_11*.jpg" --exclude="*" /Storage/uploads/ /website/uploads/
(dasselbe Konzept, aber viel wählerischer in Bezug auf die darin enthaltenen Verzeichnisse).
rsync
Beispiele für Ausschlussmuster einschließen:
"*" means everything
"dir1" transfers empty directory [dir1]
"dir*" transfers empty directories like: "dir1", "dir2", "dir3", etc...
"file*" transfers files whose names start with [file]
"dir**" transfers every path that starts with [dir] like "dir1/file.txt", "dir2/bar/ffaa.html", etc...
"dir***" same as above
"dir1/*" does nothing
"dir1/**" does nothing
"dir1/***" transfers [dir1] directory and all its contents like "dir1/file.txt", "dir1/fooo.sh", "dir1/fold/baar.py", etc...
Und eine letzte Anmerkung ist, dass Sie sich einfach nicht auf Sternchen verlassen, die am Anfang zum Bewerten von Pfaden verwendet werden; wie "**dir"
(Es ist in Ordnung, sie für einzelne Ordner oder Dateien zu verwenden, aber nicht für Pfade) und beachten Sie, dass mehr als zwei Sternchen nicht für Dateinamen funktionieren.