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
-iz
su Solaris e funziona sempre. Grazie per il puntatore.
-I
. La pagina man di AIX (6.1) dice che -i
è obsoleta e -I
dovrebbe essere usata. Solaris 10 (e 9) ha entrambi -i
e -I
.
-i
da Solaris 2.5. invecchiare è una faccenda triste, amici miei. :)
Il motivo per cui non funziona è che stai dicendo xargs
di 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 scp
viene 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 ControlMaster
e ControlPath
in .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 xargs
o find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Un'altra possibilità è usare rsync
invece di scp
. È possibile passare rsync
un elenco di nomi di file sull'input standard. Poiché si rsync
aspetta 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