Risposte:
prova questo. dovrebbe funzionare con le versioni recenti di xargs.
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
in alternativa, puoi semplicemente eseguire il loop dei file.
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-Izè-iz
-izsu Solaris e funziona sempre. Grazie per il puntatore.
-I. La pagina man di AIX (6.1) dice che -iè obsoleta e -Idovrebbe essere usata. Solaris 10 (e 9) ha entrambi -ie -I.
-ida Solaris 2.5. invecchiare è una faccenda triste, amici miei. :)
Il motivo per cui non funziona è che stai dicendo xargsdi correre
scp my_name@my_server:~/ a.py b.py c.py
L'ordine degli argomenti non corrisponde a quello che vuoi fare. Una soluzione è forzare la visualizzazione dei nomi dei file prima della destinazione sulla riga di comando. Ciò richiede xarg GNU (cioè Linux o Cygwin). Mentre ci siamo, possiamo passare -d '\n'per assicurarci che qualsiasi nome di file che non contenga newline funzioni (senza -d, xargs si aspetta una strana citazione del suo input); ciò non è necessario se si lavora con alberi di sorgenti software tipiche, in cui i nomi dei file tendono ad essere molto mansueti.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Un aspetto negativo di questo metodo è che scpviene chiamato separatamente per ogni file. Se stai copiando molti piccoli file, ciò può fare una differenza significativa, poiché una connessione SSH richiede un po 'di tempo per stabilire. È possibile abbreviare notevolmente i tempi per connessione utilizzando una connessione master SSH (che è al di fuori dell'ambito di questa risposta, consultare il manuale, in particolare le opzioni ControlMastere ControlPathin .ssh/config).
Un modo per forzare gli argomenti a trovarsi nel posto giusto è passare attraverso una shell intermedia. Questa è una tecnica generale per riordinare gli argomenti quando si utilizza xargso find … -exec.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Un'altra possibilità è usare rsyncinvece di scp. È possibile passare rsyncun elenco di nomi di file sull'input standard. Poiché si rsyncaspetta un elenco di modelli e non un elenco di nomi di file, ciò richiede che i nomi dei file non contengano caratteri jolly (in particolare, nessuna nuova riga, nessuna \[*?e nessuna iniziale #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:~/xargs