Я хочу загружать некоторые файлы на машины параллельно. Там есть список хостов и список файлов, которые должны быть загружены по индексу: 1.txt идет в hostOne , 2.txt идет в hostTwo и т.д. Вот что я пытаюсь сделать:

cat hosts | xargs -P 10 -I {} scp ./${LINE}.txt user@{}:/tmp

Как заставить это работать (${LINE} не является частью синтаксиса xargs)?

2 ответа2

2

xargs не может интерпретировать номера строк для вас. Вместо этого вы должны использовать что-то вроде nl для добавления номеров строк:

$ echo -ne "a\nb\nc\n" \
    | nl -bt -nln
1       a
2       b
3       c

Затем вам нужно отформатировать команду, чтобы она могла быть передана xargs качестве аргументов scp , используя что-то вроде sed:

$ echo -ne "a\nb\nc\n" \
    | nl -bt -nln \
    | sed -re 's!^([0-9]+) +\t(.+)$!./\1.txt user@\2:/tmp!'
./1.txt user@a:/tmp
./2.txt user@b:/tmp
./3.txt user@c:/tmp

Наконец-то беги!

$ echo -ne "a\nb\nc\n" \
    | nl -bt -nln \
    | sed -re 's!^([0-9]+) +\t(.+)$!./\1.txt user@\2:/tmp!' \
    | xargs -P10 -l1 -t scp
scp ./1.txt user@a:/tmp
scp ./2.txt user@b:/tmp
scp ./3.txt user@c:/tmp

Обратите внимание, что это обеспечивает плохую связь между хостом и передаваемым файлом (это делается только по номеру строки ...)

nl

  • -bt - число только непустых строк
  • -nln - использовать выравнивание по левому краю без начальных нулей

sed

  • -r - использовать расширенное регулярное выражение
  • -e 's!^([0-9]+) +\t(.+)$!./\1.txt user@\2:/tmp!' - скрипт для использования
    • ^([0-9]+) +\t(.+)$ Совпадают номера, за которыми следуют пробелы, затем табуляция, затем любой символ
    • \1.txt user@\2:/tmp - замены, используя группы выше (inside ())

xargs

  • -P10 - запускать до 10 процессов одновременно
  • -l1 - ограничить использование xargs одной строкой ввода на процесс
  • -t - вывести команды по мере их выполнения
2

Этот фильтр

awk '{print NR ".txt user@" $1 ":/tmp"}'

превращает foo в 1.txt user@foo:/tmp . Число увеличивается с каждой строкой. Ваша команда должна быть такой:

<hosts awk '{print NR ".txt user@" $1 ":/tmp"}' | xargs -L 1 scp

Настройте его в соответствии со своими потребностями (например, -P 10). Также обратите внимание, что вам не нужен cat чтобы прочитать файл.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .