Надайте параметри для scp за допомогою xargs


10

Коли я бігаю svn st | awk '{print $2}', отримую:

a.py
b.py
c.py

Потім я хочу перенести scpці файли на віддалений сервер. Я намагався:

svn st | awk '{print $2}' | xargs scp my_name@my_server:~/

Але це не працює. Яка правильна команда для цього?

Дякую!

Відповіді:


10

спробуйте це. повинні працювати з останніми версіями 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


2
Дякую Тим. Я дуже гуглив і знайшов рішення: svn st | awk '{print $2}' | xargs -J % scp % my_name@my_server:~/я повинен був прочитати сторінку людини, xargsперш ніж запитати;)
mitnk

І ваше рішення теж працює! Але є помилка -Iz-iz
друку

яку ОС ви використовуєте? Я використовую -izSolaris, і це завжди працює. Дякуємо за вказівник.
Тім Кеннеді

4
POSIX xargs має -I. Сторінка підручника AIX (6.1) говорить про -iзастарілість і її -Iслід використовувати. Solaris 10 (і 9) має і те, -iі -I.
Мат

1
Ах, мої знання застарілі! Я використовую -iз Solaris 2.5. старіти - це сумна справа, мої друзі. :)
Тім Кеннеді

4

Причина цього не працює в тому, що ви говорите 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:~/
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.