Machen Sie xargs, um den Befehl für jede Eingabezeile einmal auszuführen
Wie kann ich xargs ausführen des Befehls genau einmal für jede Zeile der Eingabe gegeben?
Es ist Standard-Verhalten ist zum aufteilen der Zeilen und führen Sie den Befehl einmal ein, passieren mehrere Zeilen für jede Instanz.
Vom http://en.wikipedia.org/wiki/Xargs:
find /Pfad -type f -print0 | xargs -0 rm
In diesem Beispiel finden die feeds die Eingabe von xargs mit einer langen Liste von Dateinamen. xargs dann teilt diese Liste in Teillisten und ruft rm einmal für jede Teilliste. Dies ist effizienter, als das funktional äquivalent version:
find /Pfad -type f -exec rm '{}' \;
Weiß ich, dass finden, hat die "exec" - flag. Ich bin nur unter Angabe eines anschaulichen Beispiels aus der anderen Quelle.
InformationsquelleAutor der Frage Readonly | 2008-10-13
Du musst angemeldet sein, um einen Kommentar abzugeben.
aus der man-page:
InformationsquelleAutor der Antwort Draemon
Scheint es mir, alle vorhandenen Antworten auf dieser Seite sind falsch, einschließlich der als korrekt markiert. Das ergibt sich aus der Tatsache, dass die Frage zweideutig formuliert.
Zusammenfassung: Wenn Sie wollen, um den Befehl auszuführen "genau einmal für jede Zeile der Eingabe gegeben," vorbei, die gesamte Zeile (ohne den Zeilenumbruch), um den Befehl als einzige argument, dann ist dies die beste UNIX-kompatiblen Art und Weise, es zu tun:
GNU
xargs
kann oder kann nicht nützliche Erweiterungen, die es ermöglichen, Sie zu tun, Weg mittr
aber Sie sind nicht verfügbar unter OS X und anderen UNIX-Systemen.Nun für die lange Erklärung...
Gibt es zwei Fragen zu berücksichtigen, bei der Verwendung von xargs:
Testen xargs' Verhalten, wir brauchen ein Dienstprogramm, das zeigt, wie oft es ausgeführt wird, und mit wie vielen Argumenten. Ich weiß nicht, ob es ist ein standard-Werkzeug zu tun, aber wir können den code ganz einfach in der bash:
Vorausgesetzt, Sie speichern Sie es als
show
im aktuellen Verzeichnis und machen es ausführbar, hier ist, wie es funktioniert:Nun, wenn die ursprüngliche Frage ist wirklich über Punkt 2. oben (wie ich denke, es ist, nach dem Lesen ein paar mal über) und es ist zu Lesen wie folgt (änderungen in Fettdruck):
dann ist die Antwort
-n 1
.Vergleichen wir xargs' default-Verhalten, das teilt sich den Eingang um Leerzeichen und ruft den Befehl als wenige Male wie möglich:
und sein Verhalten mit
-n 1
:Wenn auf der anderen Seite, die ursprüngliche Frage war über Punkt 1. Eingabe aufspalten und es zu Lesen war wie dieser (viele Menschen hier scheinen zu denken, dass dies der Fall ist, oder verwirrend sind die zwei Probleme):
dann die Antwort ist mehr subtil.
Man würde denken, dass
-L 1
behilflich sein könnte, aber es stellt sich heraus, es ändert sich nicht-argument-parsing. Es führt nur den Befehl einmal für jede Zeile eingeben, mit wie vielen Argumente, als die dort waren, auf, die Eingabe-Zeile:Nicht nur das, aber wenn eine Zeile endet mit Leerzeichen, es wird an die nächste:
Klar,
-L
ist nicht über das ändern der Weise xargs teilt die Eingabe in Argumente.Das einzige argument, das so nicht in ein cross-Plattform-Mode (ohne GNU-Erweiterungen) ist
-0
teilt den Eingang herum NUL-bytes.Dann, es ist nur eine Frage der übersetzung Zeilenumbrüche zu NUL mit Hilfe von
tr
:Nun das argument parsing sieht alle Rechte, einschließlich der Leerzeichen.
Schließlich, wenn Sie kombinieren diese Technik mit
-n 1
bekommen Sie genau einen Befehl-Ausführung pro Zeile eingeben, was die Eingabe, die Sie haben, die möglicherweise noch eine andere Sichtweise auf die ursprüngliche Frage (möglicherweise die meisten intuitiv, da der Titel):InformationsquelleAutor der Antwort Tobia
Wenn Sie möchten, führen Sie den Befehl für jeder Linie (d.h. Ergebnis) aus
find
dann was brauchen Sie, um diexargs
?Versuchen:
find
Pfad-type f -exec
Ihre-Befehl{} \;
wo die wörtliche
{}
wird ersetzt durch den Dateinamen und die wörtliche\;
ist erforderlich fürfind
zu wissen, dass der benutzerdefinierte Befehl endet dort.EDIT:
(nach der Bearbeitung Ihrer Frage zu klären wissen Sie über
-exec
)Vom
man xargs
:Beachten Sie, dass Dateinamen mit der Endung-Rohlinge würde Ursache, die Sie beunruhigen, wenn Sie
xargs
:Also, wenn Sie kümmern sich nicht um die
-exec
option, verwenden Sie besser-print0
und-0
:InformationsquelleAutor der Antwort tzot
Ich weiß nicht, wie die
-L
beantworten, da es nicht mit Dateien mit Leerzeichen in Ihnen, das ist eine wichtige Funktionfind -print0
.Eine bessere Lösung ist die Verwendung
tr
zu konvertieren Zeilenumbrüche zu null (\0
) Zeichen, und verwenden Sie dann diexargs -0
argument.Weiteres problem bei der Verwendung von
-L
ist auch, dass es nicht ermöglichen, dass mehrere Argumente für jedexargs
- Befehl aufrufen. Zum Beispiel, der derzeit akzeptierte Lösung nennen würde/bin/rm
für jede der Zeilen, die eine Tonne von execs. Mithilfe dertr
Befehl, dann wird der-n
können verwendet werden, um die Anzahl der eingelesenen Zeilen aus der Eingabe für jeden Aufruf des Dienstprogramms.Dies erlaubt Ihnen auch zu filtern, die die Ausgabe von find vor Umwandlung der Brüche in null-Werte.
InformationsquelleAutor der Antwort Gray
Andere alternative...
InformationsquelleAutor der Antwort Richard
ist alles, was Sie brauchen.
InformationsquelleAutor der Antwort
Diese beiden Möglichkeiten auch Arbeit, und die Arbeit wird für andere Befehle, die nicht mit suchen!
Anwendungsbeispiel:
löscht alle pyc-Dateien unter diesem Verzeichnis, auch wenn die pyc-Dateien Leerzeichen enthalten.
InformationsquelleAutor der Antwort Alex Riedler
Den folgenden Befehl findet alle Dateien (-type f) im
/path
und dann kopieren Sie Sie mitcp
den aktuellen Ordner. Beachten Sie die Verwendung, wenn-I %
angeben, ein Platzhalter-Zeichen in dercp
Befehlszeile so, dass Argumente, die platziert werden können, nachdem die Datei name.find /path -type f -print0 | xargs -0 -I % cp % .
Getestet mit xargs (GNU findutils) 4.4.0
InformationsquelleAutor der Antwort
Begrenzen Sie die Anzahl der Zeilen oder Argumente (falls es gibt Leerzeichen zwischen jedem argument) mit der --max-lines oder --max-args flags.
InformationsquelleAutor der Antwort Readonly
Es scheint ich habe nicht genug Ruf, um einen Kommentar zu Tobia ' s Antwort obenso dass ich bin das hinzufügen dieser "Antwort" zu helfen, diejenigen von uns, die wollen, zu Experimentieren mit
xargs
auf die gleiche Weise auf Windows-Plattformen.Hier ist eine windows-batch-Datei macht das gleiche wie Tobia ist schnell codiert "show" Skript:
InformationsquelleAutor der Antwort CrashNeb
In deinem Beispiel den Punkt der Rohrleitungen, die die Ausgabe von find, xargs ist, dass das standard-Verhalten von find-exec-option ausführen den Befehl einmal für jede Gefundene Datei. Wenn Sie finden, und Sie möchten die standard-Verhalten, dann ist die Antwort einfach - nicht verwenden, xargs, um mit zu beginnen.
InformationsquelleAutor der Antwort Sherm Pendley
ausführen von ant-task sauber-alle auf jeden build.xml auf die aktuelle und sub-Ordner.
InformationsquelleAutor der Antwort sergiofbsilva