Xargs mit mehreren Argumenten
Habe ich eine Quelle, input.txt
a.txt
b.txt
c.txt
Ich füttern wollen diesen input in ein Programm wie das folgende:
my-program --file=a.txt --file=b.txt --file=c.txt
So, ich versuche es mal mit xargsaber ohne Glück.
cat input.txt | xargs -i echo "my-program --file"{}
Gibt es
my-program --file=a.txt
my-program --file=b.txt
my-program --file=c.txt
Aber ich will
my-program --file=a.txt --file=b.txt --file=c.txt
Irgendeine Idee?
InformationsquelleAutor der Frage Howard | 2010-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Keine der Lösungen so weit beschäftigt sich richtig mit dem Datei-Namen mit Leerzeichen. Einige sogar scheitern, wenn die Datei-Namen enthalten " oder ". Wenn Sie Ihre Eingabe-Dateien werden von den Benutzern generiert werden, sollten Sie bereit sein für überraschende Dateinamen.
GNU Parallel beschäftigt sich schön mit diesem Dateinamen und gibt Sie (mindestens) 3 verschiedene Lösungen. Wenn Ihr Programm dauert 3 und nur 3 Argumente, dann funktioniert das:
Oder:
Wenn, jedoch, Ihr Programm nimmt so viele Argumente auf der Kommandozeile:
Sehen Sie das intro-video um mehr zu erfahren: http://www.youtube.com/watch?v=OpaiGYxkSuQ
InformationsquelleAutor der Antwort Ole Tange
dont hören Sie alle von Ihnen 🙂
schauen Sie sich nur dieses Beispiel an:
Ausgang
InformationsquelleAutor der Antwort sauliux
Wie etwa:
InformationsquelleAutor der Antwort yabt
Können Sie
sed
Präfix--file=
jeder Zeile und rufen Sie dannxargs
:InformationsquelleAutor der Antwort Bart Sas
Hier ist eine Lösung mit sed für die drei Argumente, aber ist begrenzt, es gilt die gleiche Transformation auf jedes argument:
Hier ist eine Methode, die die Arbeit für zwei args, erlaubt aber mehr Flexibilität:
InformationsquelleAutor der Antwort maharvey67
Weil
echo
druckt einen Zeilenumbruch. Versuchen Sie so etwas wieInformationsquelleAutor der Antwort aioobe
War ich auf der Suche nach einer Lösung für genau dieses problem und kam zu dem conclution, die Codierung ein Skript in der Mitte.
verwandeln die standard-Ausgabe für das nächste Beispiel wird die Option-n '\n' delimeter
Beispiel:
Damit diese Lösung funktioniert, müssen Sie ein Leerzeichen zwischen die Argumente file1.txt und file2.txt oder was auch immer delimeter, die Sie wählen, eine weitere Sache, im script achten Sie darauf, check -f1 und -f2, als Sie bedeuten "nimm das erste Wort und das zweite Wort" abhängig von der ersten delimeter position gefunden (delimeters sein könnte','';''.', was Sie wollen, die zwischen einfachen Anführungszeichen stehen .
Fügen Sie so viele Parameter wie Sie möchten.
Problem gelöst mit xargs, Schnitt und einige bash-scripting.
Prost!
wenn du willst vorbei, ich habe einige nützliche Tipps http://hongouru.blogspot.com
InformationsquelleAutor der Antwort HoNgOuRu
xargs funktioniert das nicht so. Versuchen:
InformationsquelleAutor der Antwort Burton Samograd
Niemand erwähnt hat echo aus einer Schleife noch, also werde ich das in der Vollständigkeits halber (es wäre mein zweiter Ansatz, die sed ein, die erste):
InformationsquelleAutor der Antwort conny
Stieß ich auf ein ähnliches problem und fand die Lösung, die ich denke ist schöner und sauberer als die bisher dargestellten.
Die syntax für
xargs
dass ich endete mit wäre (für dein Beispiel):mit einer vollständigen Befehlszeile:
die Arbeit, als ob
gemacht wurde (vorausgesetzt
input.txt
enthält Daten aus deinem Beispiel).Eigentlich in meinem Fall musste ich zuerst suchen Sie die Dateien, und auch Sie brauchte sortiert, so meine Befehlszeile sieht wie folgt aus:
Paar details, die vielleicht nicht klar sein (Sie waren nicht für mich):
some*pattern
müssen angegeben werden, da sonst gelten würde, erweitern Sie es vor der übergabe zufind
.-print0
dann-z
und schließlich-0
mit null-Abstand, um die ordnungsgemäße Handhabung von Dateien mit Leerzeichen oder anderen WLAN-Namen.Beachten Sie jedoch, dass ich nicht testen, es tief noch. Obwohl es scheint zu funktionieren.
InformationsquelleAutor der Antwort Adam Badura
Eigentlich ist es relativ einfach:
... | sed 's/^/--prefix=/g' | xargs echo | xargs -I PARAMS your_cmd PARAMS
Den
sed 's/^/--prefix=/g'
ist optional, wenn Sie brauchen, um das Präfix jedes param-mit einigen --prefix=.Den
xargs echo
stellt sich die Liste der param-Zeilen (eine param in jeder Zeile) in eine Liste der Parameter in einer einzigen Zeile, diexargs -I PARAMS your_cmd PARAMS
können Sie einen Befehl ausführen, indem Sie die params-wo immer Sie wollen.So
cat input.txt | sed 's/^/--file=/g' | xargs echo | xargs -I PARAMS my-program PARAMS
tut, was Sie brauchen (vorausgesetzt, dass alle Zeilen innerhalb input.txt sind einfach und gelten als ein single-param-Wert).InformationsquelleAutor der Antwort Moshe Bixenshpaner
Ist es einfacher wenn du zwei xargs Aufrufe: 1. verwandeln Sie jede Zeile in
--file=...
2. um tatsächlich die xargs-Ding ->InformationsquelleAutor der Antwort jjo