rsync не говорить регулярно. Ви можете зарахувати пошук і греп, хоча це стає трохи таємницею. Щоб знайти цільові файли:
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/
--exclude='*'
?