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
- вывести команды по мере их выполнения