Cuando corro svn st | awk '{print $2}'
, obtengo:
a.py
b.py
c.py
Entonces quiero scp
estos archivos a un servidor remoto. Yo he tratado:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
Pero no funciona. ¿Cuál es el comando correcto para hacer esto?
¡Gracias!
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
que debería haber leído la página del manual dexargs
antes de pedir;)-Iz
no-iz
-iz
en Solaris, y siempre funciona. Gracias por la anotación.-I
. La página de manual de AIX (6.1) dice que-i
está obsoleta y que-I
debe usarse. Solaris 10 (y 9) tiene ambos-i
y-I
.-i
desde Solaris 2.5. envejecer es un asunto triste, mis amigos. :)La razón por la que esto no funciona es porque le estás diciendo
xargs
que corrasEl orden de los argumentos no corresponde a lo que quieres hacer. Una solución es forzar que los nombres de los archivos aparezcan antes del destino en la línea de comando. Esto requiere GNU xargs (es decir, Linux o Cygwin). Mientras estamos en eso, podemos pasar
-d '\n'
para asegurarnos de que cualquier nombre de archivo que no contenga nuevas líneas funcionará (sin-d
, xargs espera alguna cita extraña de su entrada); esto no es necesario si trabaja con árboles de fuentes de software típicos, en los que los nombres de los archivos tienden a ser muy mansos.Una desventaja de este método es que
scp
se llama por separado para cada archivo. Si está copiando muchos archivos pequeños, eso puede marcar una diferencia significativa, ya que una conexión SSH tarda un poco en establecerse. Puede acortar en gran medida el tiempo por conexión mediante el uso de una conexión maestra SSH (que está fuera del alcance de esta respuesta, consulte el manual, especialmente las opcionesControlMaster
y ).ControlPath
.ssh/config
Una forma de forzar a los argumentos a estar en el lugar correcto es pasar por un caparazón intermedio. Esta es una técnica general para reordenar argumentos cuando se usa
xargs
ofind … -exec
.Otra posibilidad es usar en
rsync
lugar descp
. Puede pasarrsync
una lista de nombres de archivo en la entrada estándar. Dado quersync
espera una lista de patrones y no una lista de nombres de archivos, esto requiere que los nombres de sus archivos no contengan caracteres comodín (específicamente, no hay líneas nuevas, no\[*?
y no iniciales#
o;
).fuente