rsync spricht keinen regulären Ausdruck. Sie können find und grep eintragen, obwohl es ein wenig arkan wird. So finden Sie die Zieldateien:
find a/ |
grep -i 'name'
Aber sie haben alle das Präfix "a /" - was Sinn macht, aber am Ende möchten wir eine Liste von Include-Mustern haben, die für rsync akzeptabel sind, und da das Präfix "a /" für rsync I nicht funktioniert ' ll entfernen Sie es mit Schnitt:
find . |
grep -i 'name' |
cut -d / -f 2-
Es gibt immer noch ein Problem - wir werden immer noch Dateien in Unterverzeichnissen vermissen, da rsync keine Verzeichnisse in der Ausschlussliste durchsucht. Ich werde awk verwenden, um die Unterverzeichnisse aller übereinstimmenden Dateien zur Liste der Include-Muster hinzuzufügen:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Alles, was übrig bleibt, ist, die Liste an rsync zu senden - wir können das Argument --include-from = - verwenden, um eine Liste von Mustern für rsync bei Standardeingabe bereitzustellen. Also insgesamt:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Beachten Sie, dass auf das Quellverzeichnis 'a' über zwei verschiedene Pfade verwiesen wird - "a /" und "./a/". Das ist subtil, aber wichtig. Um die Konsistenz zu verbessern, werde ich eine letzte Änderung vornehmen und das Quellverzeichnis immer als "./a/" bezeichnen. Dies bedeutet jedoch, dass der Befehl cut geändert werden muss, da auf der Vorderseite der Ergebnisse von find ein zusätzliches "./" angezeigt wird:
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
--exclude='*'
?