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 -dxargs 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 scpsie 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 ControlMasterund ControlPathOptionen 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 xargsoder find … -exec.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Eine andere Möglichkeit ist, rsyncanstelle von zu verwenden scp. Sie können rsynceine Liste von Dateinamen bei der Standardeingabe übergeben. Da rsynceine 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,xargsbevor ich gefragt habe;)