
Много-много раз в день я ловлю себя на мысли, что мне нужно скопировать один или два файла с моей локальной машины ~/src/some/path/or/other
и на нее, на тестовый хост и соответственно на него. Два пути идентичны после ~/src и /srv/www соответственно -- хотя, очевидно, я обычно опускаю имя файла во втором аргументе scp, который я сейчас использую.~/src/some/different/path
/srv/www/some/path/or/other
/srv/www/some/different/path
Проблема в том, что я довольно часто полностью проверяю вызов scp и копирую файл в неправильный каталог или перезаписываю другой файл, потому что tab complete умудряется меня перехитрить. Я мог бы синхронизировать все свое локальное дерево с сервером через ssh, но иногда я не хочу загружать все сразу — только определенный файл.
Думаю, мне нужен простой инструмент CLI, который позволит мне сделать (возможно, с небольшой настройкой) что-то вроде следующего:
jkg5150@dev-laptop:~/src/myproject$ funkytool path/to/file another/path/another-file mydevhost.mycompany.com
...и file
скопировали в mydevhost.mycompany.com:/srv/www/myproject/path/to/
, и another-file
скопировали в mydevhost.mycompany.com:/srv/www/myproject/another/path/
.
Наверняка я упускаю какой-то трюк — или мне стоит его написать?
решение1
Используйте rsync с -R
опцией. Из rsync(1)
страницы руководства:
-R, --relative
Use relative paths. This means that the full path names speci‐
fied on the command line are sent to the server rather than just
the last parts of the filenames. This is particularly useful
when you want to send several different directories at the same
time. For example, if you used this command:
rsync -av /foo/bar/baz.c remote:/tmp/
... this would create a file named baz.c in /tmp/ on the remote
machine. If instead you used
rsync -avR /foo/bar/baz.c remote:/tmp/
then a file named /tmp/foo/bar/baz.c would be created on the
remote machine, preserving its full path. These extra path ele‐
ments are called "implied directories" (i.e. the "foo" and the
"foo/bar" directories in the above example).