Proporcionar parameters a scp con xargs

Cuando ejecuto svn st | awk '{print $2}' svn st | awk '{print $2}' , obtengo:

 a.py b.py c.py 

Luego quiero scp estos files en un server remoto. Yo he tratado:

 svn st | awk '{print $2}' | xargs scp my_name@my_server:~/ 

Pero no funciona. ¿Cuál es el command correcto para hacer esto?

¡Gracias!

testing esto. debería funcionar con versiones recientes de xargs.

svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:

alternativamente, podría simplemente pasar por los files.

for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done

La razón por la que esto no funciona es porque estás diciendo a xargs que se ejecute

 scp my_name@my_server:~/ a.py b.py c.py 

El order de los arguments no se corresponde con lo que quieres hacer. Una solución es forzar que los nombres de file aparezcan antes del destino en la línea de command. Esto requiere GNU xargs (es decir, Linux o Cygwin). Mientras estamos en eso, podemos pasar -d '\n' para asegurarnos de que cualquier nombre de file que no contenga líneas nuevas funcione (sin -d , xargs espera algunas citas raras de su input); esto no es necesario si trabajas con treees de fonts de software típicos, en los cuales los nombres de file tienden a ser muy dóciles.

 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 file. Si está copyndo muchos files pequeños, eso puede marcar una gran diferencia, ya que una connection SSH tarda un poco en establecerse. Puede acortar en gran medida el time por connection utilizando una connection maestra SSH (que está más allá del scope de esta respuesta, consulte el manual, especialmente las opciones ControlMaster y ControlPath en .ssh/config ).

Una forma de forzar que los arguments estén en el lugar correcto es pasar por un caparazón intermedio. Esta es una técnica general para reorderar arguments al usar xargs o find … -exec .

 svn st | awk '{print $2}' | xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/ 

Otra posibilidad es usar rsync lugar de scp . Puede pasar rsync una list de nombres de files en la input estándar. Dado que rsync espera una list de patrones y no una list de nombres de files, esto requiere que los nombres de sus files no contengan ningún carácter comodín (específicamente, no líneas nuevas, no \[*? Y no inicial # o ; ).

 svn st | awk '{print $2}' | rsync -a --include-from=- --exclude='*' . my_name@my_server:~/