Как rsync файлы с совпадающим шаблоном в пути, сохраняя структуру каталога неповрежденной?
Я хочу скопировать все файлы с сервера A на сервер B, которые имеют одинаковое имя родительского каталога на разных уровнях иерархии файловой системы, например:
/var/lib/data/sub1/sub2/commonname/filetobecopied.foo
/var/lib/data/sub1/sub3/commonname/filetobecopied.foo
/var/lib/data/sub2/sub4/commonname/anotherfiletobecopied.foo
/var/lib/data/sub3/sub4/differentname/fileNOTtobecopied.foo
Я хочу скопировать первые три файла, все из которых имеют commonname
в пути к серверу B. Я уже потратил много времени на поиск правильных шаблонов include/exclude для rsync
, но я не получаю его. Следующая команда не работает:
rsync -a --include='**/commonname/*.foo' --exclude='*' [email protected]:/var/lib/data /var/lib/data
Я либо слишком много, либо несколько файлов. Как я могу синхронизировать только файлы с commonname
в своем пути?
Ответы
Ответ 1
Я думаю, вы ищете это:
rsync -a -m --include='**/commonname/*.foo' --include='*/' --exclude='*' [email protected]:/var/lib/data /var/lib/data
В вашей команде есть две отличия:
- Самый важный из них -
--include='*/'
. Без этого, как вы указали --exclude='*'
, rsync
никогда не войдет в подкаталоги, так как все исключено. С --include='*/'
, подкаталоги больше не исключаются, поэтому rsync
может с радостью отписаться.
- Наименее важным является
-m
: это сокращает пустые каталоги. Без этого вы также получите скопированный (пустой) подкаталог /var/lib/data/sub3/sub4/differentname/
.