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