Wie bekomme ich eine Zeilennummer in xargs?

384
Poma

Ich möchte einige Dateien parallel auf Maschinen hochladen. Es gibt eine Liste mit Hosts und eine Liste mit Dateien, die per Index hochgeladen werden sollten: 1.txtGeht zu hostOne, 2.txtGeht zu hostTwousw. Ich versuche Folgendes:

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

Wie funktioniert es $? ( Gehört nicht zur xargs-Syntax)?

0

2 Antworten auf die Frage

2
Attie

xargskann Zeilennummern nicht für Sie interpretieren. Stattdessen sollten Sie etwas verwenden nl, um Zeilennummern hinzuzufügen:

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

Dann müssen Sie den Befehl zu formatieren, so dass es durch übergeben werden kann xargsals Argument an scp, wie etwas mit 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 

Endlich laufen!

$ 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 

Beachten Sie, dass dies eine schlechte Verbindung zwischen dem Host und der übertragenen Datei bietet (dies geschieht nur nach Zeilennummer ...).

nl

  • -bt - nummerieren Sie nur nicht leere Zeilen
  • -nln - Verwenden Sie eine linksbündige Nummerierung ohne führende Nullen

sed

  • -r - Verwenden Sie einen erweiterten Regex
  • -e 's!^([0-9]+) +\t(.+)$!./\1.txt user@\2:/tmp!' - das zu verwendende Skript
    • ^([0-9]+) +\t(.+)$stimmen Sie mit Zahlen ab, gefolgt von Leerzeichen, dann einem Tabulator und einem beliebigen Zeichen
    • \1.txt user@\2:/tmp- Ersetzung mit Gruppen oben (innen ())

xargs

  • -P10 - bis zu 10 Prozesse gleichzeitig ausführen
  • -l1- Beschränken Sie sich xargsauf die Verwendung einer Eingabezeile pro Prozess
  • -t - Drucken Sie die Befehle so, wie sie ausgeführt werden
@schöne Erklärung! Kombiniert mit der "awk" Spitze sieht es jetzt ziemlich einfach aus Poma vor 5 Jahren 0
@Poma Formale Anmerkung: Im Allgemeinen gibt es kein "unten". Die Reihenfolge der Antworten ist nicht festgelegt. Sie haben drei Optionen, vor allem die Antworten, um sie für sich selbst neu zu ordnen. Kamil Maciorowski vor 5 Jahren 0
2
Kamil Maciorowski

Dieser Filter

awk '' 

verwandelt sich fooin 1.txt user@foo:/tmp. Die Anzahl steigt mit jeder Zeile. Ihr Befehl sollte wie folgt lauten:

<hosts awk '' | xargs -L 1 scp 

Passen Sie es an Ihre Bedürfnisse an (zB -P 10). Beachten Sie auch, dass catSie die Datei nicht lesen müssen.