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
- замены, используя группы выше (внутри()
)
xargs
-P10
- запускать до 10 процессов одновременно-l1
- ограничитьxargs
использование одной строки ввода на процесс-t
- печатать команды по мере их выполнения