xargs
não pode interpretar números de linha para você. Em vez disso, você deve usar algo como nl
para adicionar números de linha:
$ echo -ne "a\nb\nc\n" \
| nl -bt -nln
1 a
2 b
3 c
Em seguida, você precisará formatar o comando para que ele possa ser passado por xargs
como argumentos para scp
, usando algo como sed
:
$ echo -ne "a\nb\nc\n" \
| nl -bt -nln \
| sed -re 's!^([0-9]+) +\t(.+)$!./.txt user@:/tmp!'
./1.txt user@a:/tmp
./2.txt user@b:/tmp
./3.txt user@c:/tmp
Finalmente, corra!
$ echo -ne "a\nb\nc\n" \
| nl -bt -nln \
| sed -re 's!^([0-9]+) +\t(.+)$!./.txt user@:/tmp!' \
| xargs -P10 -l1 -t scp
scp ./1.txt user@a:/tmp
scp ./2.txt user@b:/tmp
scp ./3.txt user@c:/tmp
Observe que isso fornece uma má associação entre o host e o arquivo transferido (é feito apenas pelo número da linha ...)
nl
-
-bt
- numera apenas linhas não vazias
-
-nln
- use numeração justificada à esquerda, sem zeros à esquerda
sed
-
-r
- use regex estendido
-
-e 's!^([0-9]+) +\t(.+)$!./.txt user@:/tmp!'
- o script a ser usado
-
^([0-9]+) +\t(.+)$
corresponde a números seguidos por espaços, depois por um separador e, em seguida, por qualquer caractere
-
.txt user@:/tmp
- substituições, usando grupos acima (dentro de ()
)
xargs
-
-P10
- executa até 10 processos simultaneamente
-
-l1
- limit xargs
para usar uma linha de entrada por processo
-
-t
- imprime os comandos conforme são executados