Відповіді:
спробуйте це. повинні працювати з останніми версіями 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
-izSolaris, і це завжди працює. Дякуємо за вказівник.
-I. Сторінка підручника AIX (6.1) говорить про -iзастарілість і її -Iслід використовувати. Solaris 10 (і 9) має і те, -iі -I.
-iз Solaris 2.5. старіти - це сумна справа, мої друзі. :)
Причина цього не працює в тому, що ви говорите xargsбігти
scp my_name@my_server:~/ a.py b.py c.py
Порядок аргументів не відповідає тому, що ви хочете зробити. Одне рішення - змусити імена файлів з’являтися перед пунктом призначення в командному рядку. Для цього потрібні xargs GNU (тобто Linux або Cygwin). Поки ми переходимо -d '\n'до цього, ми можемо переконатися, що будь-яке ім’я файлу, що не містить нових рядків, буде працювати (без цього -d, xargs очікує деякого дивного цитування його вводу); це не обов'язково, якщо ви працюєте із типовими деревами програмного забезпечення, в яких імена файлів, як правило, дуже приручені.
svn st | awk '{print $2}' |
xargs -d\\n -I{} scp {} my_name@my_server:~/
Недоліком цього методу є те, що scpвикликається окремо для кожного файлу. Якщо ви копіюєте багато невеликих файлів, це може істотно змінитись, оскільки для встановлення з'єднання SSH потрібно трохи часу. Ви можете значно скоротити час з'єднання за допомогою головного з'єднання SSH (це перевершує сферу цієї відповіді, див. Посібник, особливо 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:~/я повинен був прочитати сторінку людини,xargsперш ніж запитати;)