Более умный scp, который дублирует часть локального пути

Более умный scp, который дублирует часть локального пути

Много-много раз в день я ловлю себя на мысли, что мне нужно скопировать один или два файла с моей локальной машины ~/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).

Связанный контент