
Предположим, у меня есть каталог на локальной машине, защищенный брандмауэром:
local:/home/meee/workdir/
И каталог на удаленной машине, по ту сторону брандмауэра:
remote:/a1/a2/.../aN/one/two/
remote:/a1/a2/.../aN/one/dont-copy-me{1,2,3,...}/
...такой, что N
>= 0.
На моей локальной машине есть скрипт, который использует rsync
. Я хочу, чтобы этот скрипт копировал только one/two/
с удаленной машины для переменной, но известной 'N', так что в итоге получится:
local:/home/meee/workdir/one/two/
Если я использую rsync remote:/a1/a2/.../aN/one/two/ ~/workdir/
, то в итоге получаю:
local:/home/meee/workdir/two/
Если я использую rsync --relative remote:/a1/a2/.../aN/one/two/ ~/workdir/
, то в итоге получаю:
local:/home/meee/workdir/a1/a2/.../aN/one/two/
Ни то, ни другое мне не нужно.
- Существуют ли
rsync
флаги, с помощью которых можно достичь желаемого результата? - Если нет, может ли кто-нибудь предложить простое решение?
решение1
Для -- относительного пути необходимо вставить точку в путь к исходному каталогу:
rsync -av --relative remote:/a1/a2/.../aN/./one/two ~/workdir/
См. руководство:
-R, --относительный
[...]
Также можно ограничить объем информации о пути, которая отправляется как подразумеваемые каталоги для каждого указанного вами пути. С современным rsync на отправляющей стороне (начиная с 2.6.7) вы можете вставить точку и косую черту в исходный путь, например:
rsync -avR /foo/./bar/baz.c remote:/tmp/
решение2
Если вы извлекаете файлы из rsync
более старой версии, чем v2.6.7, вы можете сделать это, воспользовавшись rsync
опцией --rsync-path
, которая позволяет указать, где на удаленном компьютере можно найти команду rsync. Однако вы можете использовать ее для смены каталога. Просто,
rsync -aR --rsync-path='cd /a1/a2/.../aN/ && rsync' remote:one/two/ ~/workdir/