Відповіді:
спробуйте це. повинні працювати з останніми версіями 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
Solaris, і це завжди працює. Дякуємо за вказівник.
-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
перш ніж запитати;)