Odpowiedzi:
Spróbuj tego. powinien działać z najnowszymi wersjami xargs.
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
alternatywnie możesz po prostu zapętlić pliki.
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-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ć
scp my_name@my_server:~/ a.py b.py c.py
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.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
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 opcje ControlMaster
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
lub find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Inną możliwością jest użycie rsync
zamiast scp
. 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 ;
).
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:~/
xargs