
Muchas, muchas veces al día, me encuentro deseando copiar uno o dos archivos desde ~/src/some/path/or/other
y ~/src/some/different/path
en mi máquina local, hacia /srv/www/some/path/or/other
y /srv/www/some/different/path
respectivamente en un host de prueba. Las dos rutas son idénticas después de ~/src y /srv/www respectivamente, aunque obviamente normalmente omito el nombre del archivo en el segundo argumento de scp, que uso actualmente.
El problema es que, con bastante frecuencia, toco la invocación scp por completo y copio el archivo en el directorio equivocado, o sobrescribo un archivo diferente porque la pestaña completa logra ser más astuto que yo. Podría sincronizar todo mi árbol local con el servidor a través de ssh, pero a veces no quiero cargar todo todavía, solo un archivo específico.
Supongo que lo que quiero es una herramienta CLI simple que me permita hacer (tal vez con un poco de configuración) el equivalente moral de:
jkg5150@dev-laptop:~/src/myproject$ funkytool path/to/file another/path/another-file mydevhost.mycompany.com
...y file
lo he copiado mydevhost.mycompany.com:/srv/www/myproject/path/to/
y another-file
lo he copiado mydevhost.mycompany.com:/srv/www/myproject/another/path/
.
Seguramente hay un truco que me falta, ¿o debería simplemente escribir uno?
Respuesta1
Utilice rsync con la -R
opción. Desde la rsync(1)
página de manual:
-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).