Angenommen, ich habe eine Datei mit den folgenden Angaben
bob
john
sue
Nun sind diese direkt corrospond zu (in diesem Fall) URL - Muster wie http://example.com/persons/bob.tar
, john.tar
, sue.tar
.
Ich würde diese Zeilen gerne nehmen und durchziehen xargs
. Ich weiß jedoch nicht, was an den ausgeführten Befehl übergeben wird. Wie greife ich auf den Parameter entweder über die Eingabeaufforderung (ich möchte einfach jede Zeile wie folgt ausgeben cat file | xargs echo $PARAM
) oder über ein Bash-Skript zu?
xargs
sie zeilenweise aufgeteilt und jede Zeile in einen Befehl eingespeist , oder? Wie kann ich darauf zugreifen, wenn ich etwas sagen musscat file | xargs curl http://example.com/[PASSED FROM FILE].tar
?Antworten:
Michaels Antwort ist richtig und sollte Ihr Problem lösen. Laufen
lädt die Dateien
bob.tar
john.tar.
sue.tar
wie erwartet herunter .ABER : Katze hier ist nutzlos
benutze lieber:
quelle
cat xaa xab xac xad ... xargs ...
cat
ist in Ordnung, nur um weitere Informationen hinzuzufügen ... :)xargs -I % curl …
( xargs Option vorcurl
und seine Optionen / Argumente). Zumindestxargs curl -I %
(wo-I %
als Option xargs gemeint ist , nicht locken ) ist nicht tragbar.Ich denke, Sie fragen sich, wie Sie die einzelnen Zeilen einfügen sollen, die aus
xargs
'stdin' in der Mitte eines Befehls gezogen wurden, anstatt sie immer am Ende einzufügen . In diesem-I
Fall nimmt das Flag einreplacement-string
Argument entgegen.xargs
Ersetzt dannreplacement-string
den Befehl durch die von stdin gelesene Zeile:quelle
curl http://example.com/foobar.tar > foobar.tar
?>
ist ein Shell-Konstrukt und funktioniert nicht fürxargs
. Auf der anderen Seitecurl -o
wird in eine benannte Datei anstelle von stdout geschrieben, wie waswget
tut, also ist es wahrscheinlich das, was Sie hier verwenden möchten.Sie können einstellen wollen
--delimiter=
/-d
zu'\n'
auch.Wenn Sie jedoch nur versuchen, jede Zeile in der Datei in eine URL umzuwandeln,
wird tun, und wenn Sie alle von ihnen holen wollen, leiten Sie das einfach in .
| wget -i
quelle
Ein anderer Weg mit Shell-Looping:
Sie können jede Iteration auch im Hintergrund ausführen, indem Sie sie
&
vor dem letzten Semikolon anhängen. Bei sehr großen Downloads kann dies hilfreich seinquelle
while IFS= read i ; do curl ... ; done < file
Mit GNU Parallel können Sie:
Oder:
Sehen Sie sich das Einführungsvideo zu GNU Parallel an, um mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ
quelle
while read VAR; do ... done
loop ist einfach und doch sehr vielseitig:quelle
Dies ist eine allgemeinere Version von Stefans Antwort, aber ich verwende awk in der Mitte, um den genauen "String" vorzubereiten, den xargs ausführen soll. Und dann benutzt xargs bash, um die eigentliche "Arbeit" zu erledigen.
Es ist ein bisschen übertrieben für dieses Beispiel, aber es ist eine allgemeine Lösung, die mit einigen Modifikationen viele Probleme lösen kann ...
quelle