Kiedy biegnę svn st | awk '{print $2}'
, dostaję:
a.py
b.py
c.py
Następnie chcę scp
te pliki na zdalnym serwerze. Próbowałem:
svn st | awk '{print $2}' | xargs scp my_name@my_server:~/
Ale to nie działa. Jakie jest właściwe polecenie, aby to zrobić?
Dziękuję Ci!
svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/
xargs
-Iz
nie jest-iz
-iz
na Solarisie i zawsze działa. Dzięki za wskaźnik.-I
. Strona podręcznika AIX (6.1) mówi, że-i
jest przestarzała i-I
powinna być używana. Solaris 10 (i 9) ma zarówno-i
i-I
.-i
od Solaris 2.5. starzenie się to smutny romans, moi przyjaciele. :)Powodem, dla którego to nie działa, jest to, że chcesz
xargs
uruchomićKolejność argumentów nie odpowiada temu, co chcesz zrobić. Jednym z rozwiązań jest wymuszenie wyświetlania nazw plików przed miejscem docelowym w wierszu polecenia. Wymaga to GNU xargs (tj. Linux lub Cygwin). Chociaż jesteśmy przy tym, możemy przekazać,
-d '\n'
aby upewnić się, że każda nazwa pliku, która nie zawiera nowych wierszy, będzie działać (bez-d
xargs spodziewa się dziwnego cytowania swoich danych wejściowych); nie jest to konieczne, jeśli pracujesz z typowymi drzewami źródłowymi oprogramowania, w których nazwy plików są zwykle bardzo oswojone.Minusem tej metody jest to, że
scp
jest wywoływana osobno dla każdego pliku. Jeśli kopiujesz wiele małych plików, może to mieć znaczącą różnicę, ponieważ nawiązanie połączenia SSH zajmuje trochę czasu. Możesz znacznie skrócić czas na połączenie, używając połączenia głównego SSH (poza zakresem tej odpowiedzi, patrz instrukcja, a zwłaszcza opcjeControlMaster
i ).ControlPath
.ssh/config
Sposobem na wymuszenie argumentów we właściwym miejscu jest przejście przez powłokę pośrednią. Jest to ogólna technika zmiany kolejności argumentów podczas używania
xargs
lubfind … -exec
.Inną możliwością jest użycie
rsync
zamiastscp
. Możesz przekazaćrsync
listę nazw plików na standardowe wejście. Ponieważrsync
oczekuje ona listy wzorców, a nie listy nazw plików, wymaga to, aby nazwy plików nie zawierały znaków wieloznacznych (w szczególności żadnych znaków nowej linii, żadnych znaków\[*?
początkowych#
lub;
).źródło