Fornisci i parametri per scp con xargs


10

Quando corro svn st | awk '{print $2}', ottengo:

a.py
b.py
c.py

Quindi voglio scpquesti file su un server remoto. Ho provato:

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

Ma non funziona Qual è il comando giusto per farlo?

Grazie!

Risposte:


10

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


2
Grazie Tim. Ho svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/xargs
cercato su Google

E anche la tua soluzione funziona! Ma c'è un refuso, non lo -Izè-iz
mitnk

quale sistema operativo stai usando? Uso -izsu Solaris e funziona sempre. Grazie per il puntatore.
Tim Kennedy,

4
POSIX xargs ha -I. La pagina man di AIX (6.1) dice che -iè obsoleta e -Idovrebbe essere usata. Solaris 10 (e 9) ha entrambi -ie -I.
Mat

1
Ah, la mia conoscenza è obsoleta! Uso -ida Solaris 2.5. invecchiare è una faccenda triste, amici miei. :)
Tim Kennedy,

4

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:~/
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.