Rsync не говорит регулярных выражений. Вы можете подключить find и grep, хотя это немного загадочно.
Чтобы найти целевые файлы:
find a/ |
grep -i 'name'
Но все они имеют префикс «a /» - что имеет смысл, но в итоге мы хотим получить список включаемых шаблонов, приемлемых для rsync, и, поскольку префикс «a /» не работает для rsync I ' уберу это с вырезом:
find . |
grep -i 'name' |
cut -d / -f 2-
Проблема все еще существует - мы все равно будем пропускать файлы в подкаталогах, потому что rsync не ищет каталоги в списке исключений. Я собираюсь использовать awk для добавления подкаталогов любых подходящих файлов в список шаблонов включения:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}'
Осталось только отправить список в rsync - мы можем использовать аргумент --include-from = - для предоставления списка шаблонов rsync при стандартном вводе. Итак, в целом:
find a/ |
grep -i 'name' |
cut -d / -f 2- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/
Обратите внимание, что исходный каталог 'a' упоминается через два разных пути - "a/" и "./a/". Это тонко, но важно. Чтобы сделать вещи более согласованными, я собираюсь сделать одно последнее изменение и всегда ссылаться на исходный каталог как «./a/». Тем не менее, это означает, что команда cut должна измениться, так как перед результатами поиска будет добавлен дополнительный «./»:
find ./a/ |
grep -i 'name' |
cut -d / -f 3- |
awk -F/ '{print; while(/\//) {sub("/[^/]*$", ""); print}}' |
rsync -avvz --include-from=- --exclude='*' ./a/ ./b/