Como obter o número da linha em xargs?

0

Quero fazer upload de alguns arquivos para máquinas em paralelo. Há uma lista de hosts e uma lista de arquivos que devem ser enviados por index: 1.txt vai para hostOne , 2.txt vai para hostTwo etc. Aqui está o que eu tento fazer:

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

Como fazer isso funcionar ( ${LINE} não faz parte da sintaxe do xargs)?

    
por Poma 02.08.2018 / 13:44

2 respostas

2

Este filtro

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

transforma foo em 1.txt user@foo:/tmp . O número aumenta com cada linha. Seu comando deve ser como:

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

Ajuste-o às suas necessidades (por exemplo, -P 10 ). Observe também que você não precisa de cat para ler o arquivo.

    
por 02.08.2018 / 14:01
2

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
por 02.08.2018 / 13:55