Der Grund, warum dies nicht funktioniert, ist, dass Sie sagen xargs
, dass Sie rennen sollen
scp my_name@my_server:~/ a.py b.py c.py
Die Reihenfolge der Argumente entspricht nicht dem, was Sie tun möchten. Eine Lösung besteht darin, zu erzwingen, dass die Dateinamen in der Befehlszeile vor dem Ziel angezeigt werden. Dies erfordert GNU xargs (dh Linux oder Cygwin). Während wir gerade dabei sind, können wir -d '\n'
sicherstellen, dass jeder Dateiname, der keine Zeilenumbrüche enthält, funktioniert (ohne dass -d
xargs ein seltsames Zitat seiner Eingabe erwartet). Dies ist nicht erforderlich, wenn Sie mit typischen Software-Quellbäumen arbeiten, in denen Dateinamen in der Regel sehr zahm sind.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Ein Nachteil dieser Methode ist, dass scp
sie für jede Datei separat aufgerufen wird. Wenn Sie viele kleine Dateien kopieren, kann dies einen erheblichen Unterschied bewirken, da der Aufbau einer SSH-Verbindung einige Zeit in Anspruch nimmt. Sie können die Zeit pro Verbindung erheblich verkürzen, indem Sie eine SSH-Master-Verbindung verwenden (dies liegt außerhalb des Bereichs dieser Antwort, siehe Handbuch, insbesondere ControlMaster
und ControlPath
Optionen in .ssh/config
).
Eine Möglichkeit, die Argumente an die richtige Stelle zu bringen, besteht darin, eine Zwischenschale zu durchlaufen. Dies ist eine allgemeine Technik zum Neuordnen von Argumenten bei Verwendung von xargs
oder find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Eine andere Möglichkeit ist, rsync
anstelle von zu verwenden scp
. Sie können rsync
eine Liste von Dateinamen bei der Standardeingabe übergeben. Da rsync
eine Liste von Mustern und keine Liste von Dateinamen erwartet wird, müssen Ihre Dateinamen keine Platzhalterzeichen enthalten (insbesondere keine Zeilenumbrüche, keine \[*?
und keine Initialen #
oder ;
).
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:~/
Ich hätte die Manpage von lesen sollen,xargs
bevor ich gefragt habe;)