Scp mais inteligente que duplica parte do caminho local

2

Muitas, muitas vezes por dia, eu me vejo querendo copiar um ou dois arquivos de ~/src/some/path/or/other e ~/src/some/different/path na minha máquina local, para /srv/www/some/path/or/other e /srv/www/some/different/path respectivamente em um host de teste. Os dois caminhos são idênticos depois de ~ / src e / srv / www, respectivamente - embora, obviamente, eu geralmente omita o nome do arquivo no segundo argumento para scp, que eu uso atualmente.

O problema é que, com bastante frequência, deduro inteiramente a invocação do scp e copio o arquivo para o diretório errado, ou sobrescrevo um arquivo diferente porque a aba completa consegue me enganar. Eu poderia rsync minha árvore local inteira para o servidor através de ssh, mas às vezes eu não quero carregar a coisa toda ainda - apenas um arquivo específico.

Eu acho que o que eu quero é simples ferramenta CLI que me permite fazer (talvez com um pouco de configuração) o equivalente moral de:

jkg5150@dev-laptop:~/src/myproject$ funkytool path/to/file another/path/another-file mydevhost.mycompany.com

...e tem file copiado para mydevhost.mycompany.com:/srv/www/myproject/path/to/e another-file copiado para mydevhost.mycompany.com:/srv/www/myproject/another/path/.

Certamente há um truque que estou perdendo - ou devo apenas escrever um?

James Green
fonte
Você grok bash (ou mesmo sh ) Isso parece um script de shell bastante simples.
Scott
Certo; Eu só queria saber se havia uma ferramenta existente antes de eu rolar o meu próprio.
James Green

Respostas:

3

Use o rsync com o -R opção. De rsync(1) página man:

   -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).
Ignacio Vazquez-Abrams
fonte
Isto parece ser exatamente o que eu estava procurando - obrigado!
James Green