Quando corro svn st | awk '{print $2}'
, recebo:
a.py
b.py
c.py
Então eu quero scp
esses arquivos para um servidor remoto. Eu tentei:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
Mas isso não funciona. Qual é o comando certo para fazer isso?
Obrigado!
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
Eu deveria ter ler a página homem dexargs
antes de pedir;)-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 executarA 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.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çõesControlMaster
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
oufind … -exec
.Outra possibilidade é usar em
rsync
vez descp
. Você pode passarrsync
uma lista de nomes de arquivos na entrada padrão. Comorsync
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;
).fonte