Ответы:
попробуй это. должен работать с последними версиями xargs.
svn st | awk '{print $2}' | xargs -iz scp z my_name@my_server:
поочередно, вы можете просто зациклить файлы.
for file in $(svn st | awk '{print $2}'); do scp $file my_name@my_server: ; done
-Iz
не так-iz
-iz
на Солярисе, и он всегда работает. Спасибо за указатель.
-I
. Справочная страница AIX (6.1) говорит, -i
что устарела и -I
должна использоваться. Солярис 10 (и 9) имеет как -i
и -I
.
-i
с Solaris 2.5. состариться, это печальное дело, друзья мои. :)
Причина, по которой это не работает, в том, что вы говорите xargs
бежать
scp my_name@my_server:~/ a.py b.py c.py
Порядок аргументов не соответствует тому, что вы хотите сделать. Одно из решений заключается в том, чтобы имена файлов отображались перед адресатом в командной строке. Для этого требуется GNU xargs (то есть Linux или Cygwin). Пока мы работаем над этим, мы можем передать, -d '\n'
что любое имя файла, которое не содержит символов новой строки, будет работать (без -d
, xargs ожидает некоторого странного цитирования своего ввода); в этом нет необходимости, если вы работаете с типичными деревьями исходного кода программного обеспечения, в которых имена файлов имеют тенденцию быть очень ручными.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Недостатком этого метода является то, что он scp
вызывается отдельно для каждого файла. Если вы копируете много маленьких файлов, это может иметь существенное значение, так как для установки SSH-соединения требуется немного времени. Вы можете значительно сократить каждое подключение времени с помощью мастер SSH - соединения (это outstide рамки этого ответа, смотрите руководство, особенно ControlMaster
и ControlPath
варианты в .ssh/config
).
Чтобы заставить аргументы быть в нужном месте, нужно пройти через промежуточную оболочку. Это общая техника для изменения порядка аргументов при использовании xargs
или find … -exec
.
svn st | awk '{print $2}' |
xargs -d\\n sh -c 'scp "$@" "$0" my_name@my_server:~/
Другая возможность заключается в использовании rsync
вместо scp
. Вы можете передать rsync
список имен файлов на стандартный ввод. Так как rsync
ожидает список шаблонов, а не список имен файлов, для этого необходимо, чтобы имена файлов не содержали подстановочных знаков (в частности, без перевода строки, без \[*?
и без начальных #
или ;
).
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:~/
я должен был прочитать man-страницу,xargs
прежде чем спрашивать;)