Respostas:
tente isso. deve funcionar com versões recentes do xargs.
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
alternativamente, você pode simplesmente repetir os arquivos.
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-Iz
não-iz
-iz
no Solaris, e sempre funciona. Obrigado pelo ponteiro.
-I
. A página do manual AIX (6.1) diz que -i
está obsoleta e -I
deve ser usada. O Solaris 10 (e 9) possui ambos -i
e -I
.
-i
desde o Solaris 2.5. envelhecer é um assunto triste, meus amigos. :)
A razão pela qual isso não funciona é que você está dizendo xargs
para executar
scp my_name@my_server:~/ a.py b.py c.py
A ordem dos argumentos não corresponde ao que você deseja fazer. Uma solução é forçar os nomes dos arquivos a aparecerem antes do destino na linha de comando. Isso requer GNU xargs (ou seja, Linux ou Cygwin). Enquanto estamos nisso, podemos passar -d '\n'
para garantir que qualquer nome de arquivo que não contenha novas linhas funcione (sem -d
, o xargs espera algumas citações estranhas de sua entrada); isso não é necessário se você trabalhar com árvores de origem de software típicas, nas quais os nomes de arquivos tendem a ser muito mansos.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Uma desvantagem desse método é que scp
é chamado separadamente para cada arquivo. Se você estiver copiando muitos arquivos pequenos, isso pode fazer uma diferença significativa, pois uma conexão SSH demora um pouco para ser estabelecida. Você pode reduzir bastante o tempo por conexão usando uma conexão mestre SSH (que está além do escopo desta resposta, consulte o manual, especialmente as opções ControlMaster
e ).ControlPath
.ssh/config
Uma maneira de forçar os argumentos a estarem no lugar certo é passar por um shell intermediário. Essa é uma técnica geral para reordenar argumentos ao usar xargs
ou find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Outra possibilidade é usar em rsync
vez de scp
. Você pode passar rsync
uma lista de nomes de arquivos na entrada padrão. Como rsync
espera uma lista de padrões e não uma lista de nomes de arquivos, isso exige que os nomes de arquivos não contenham caracteres curinga (especificamente, sem novas linhas, sem \[*?
e sem inicial #
ou ;
).
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:~/
Eu deveria ter ler a página homem dexargs
antes de pedir;)