Respuestas:
prueba esto. debería funcionar con versiones recientes de xargs.
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
alternativamente, puede simplemente recorrer los archivos.
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-Iz
no-iz
-iz
en Solaris, y siempre funciona. Gracias por la anotación.
-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 corras
scp my_name@my_server:~/ a.py b.py c.py
El 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.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
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 opciones ControlMaster
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
o find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Otra posibilidad es usar en rsync
lugar de scp
. Puede pasar rsync
una lista de nombres de archivo en la entrada estándar. Dado que rsync
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 ;
).
svn st | awk '{print $2}' |
rsync -a --include-from=- --exclude='*' . my_name@my_server:~/
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;)