Wenn ich renne svn st | awk '{print $2}'
, bekomme ich:
a.py
b.py
c.py
Dann möchte ich scp
diese Dateien auf einen Remote-Server übertragen. Ich habe versucht:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
Aber es funktioniert nicht. Was ist der richtige Befehl, um dies zu tun?
Danke!
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;)-Iz
nicht-iz
-iz
unter Solaris und es funktioniert immer. Danke für den Zeiger.-I
. Die AIX (6.1) -Manpage sagt, dass sie-i
veraltet ist und-I
verwendet werden sollte. Solaris 10 (und 9) hat beide-i
und-I
.-i
seit Solaris 2.5. alt zu werden ist eine traurige Angelegenheit, meine Freunde. :)Der Grund, warum dies nicht funktioniert, ist, dass Sie sagen
xargs
, dass Sie rennen sollenDie 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.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, insbesondereControlMaster
undControlPath
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
oderfind … -exec
.Eine andere Möglichkeit ist,
rsync
anstelle von zu verwendenscp
. Sie könnenrsync
eine Liste von Dateinamen bei der Standardeingabe übergeben. Darsync
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;
).quelle