xargs mit mehreren Befehlen
In das aktuelle Verzeichnis ist, möchte ich zum drucken den Dateinamen und Inhalt.
Ich kann drucken, Dateinamen oder Inhalt getrennt von
find . | grep "file_for_print" | xargs echo
find . | grep "file_for_print" | xargs cat
aber was ich will, ist Druck Sie zusammen, wie diese:
file1
line1 inside file1
line2 inside file1
file2
line1 inside file2
line2 inside file2
Lese ich xargs mit mehreren Befehlen als argument
und versucht
find . | grep "file_for_print" | xargs -I % sh -c 'echo; cat;'
aber nicht funktioniert.
Ich bin nicht vertraut mit xargs, also nicht wissen, was genau "-I % sh -c" bedeutet.
könnte mir jemand helfen? danke!
dies versuchen ..... ich denke, das sollte helfen", finden Sie . | grep "file_for_print" | xargs mehr "
InformationsquelleAutor user987654 | 2013-09-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
So starten Sie mit, es gibt praktisch keinen Unterschied zwischen:
und
außer, dass die zweite wird nicht mit Dateinamen wie
this_is_not_the_file_for_print
, und es wird gedruckt, die Dateinamen pro Zeile ein. Es wird auch sehr viel schneller sein, weil Sie nicht brauchen, zu generieren und zu drucken die gesamte rekursive Verzeichnis-Struktur nur, um für grep zu werfen, das meiste davon entfernt.ist eigentlich genau das gleiche wie
wo die
-print
Aktion druckt jeder passenden Dateinamen gefolgt von einem newline. Wenn Sie nichtfind
bei allen Aktionen, es wird davon ausgegangen, Sie wollte-print
. Aber es hat mehr tricks auf Lager als das. Zum Beispiel:Den
-exec
- Aktion finden Sie auf den folgenden Befehl ausführen, bis die\;
ersetzen{}
mit jeweils passenden Dateinamen.find
beschränkt sich nicht auf eine einzelne Aktion. Man kann sagen, es zu tun, jedoch viele Sie wollen. Also:wird wohl ziemlich gut zu tun, was Sie wollen.
Für viel mehr Informationen über dieses sehr nützliche Werkzeug, Typ:
oder
und Lesen Sie alles über Es.
ja, find und xargs sind ziemlich erstaunlich.
InformationsquelleAutor
find . | grep "file_for_print" | xargs -I % sh -c 'echo %; cat %;'
(OP fehlte%
s)freut sich auf Hilfe 🙂
InformationsquelleAutor
Da es bisher nicht, sagte noch:
-I %
sagt xargs ersetzen '%' mit den Argumenten, die in dem Befehl, den Sie geben. Diesh -c '...'
bedeutet nur die Befehle ausführen'...'
in einer neuen shell.So
laufen
echo [filename]
gefolgt voncat [filename]
für jeden Dateinamen gegebenxargs
. Das echo und cat Befehle ausgeführt werden, die in einem anderen shell-Prozess, aber dies in der Regel egal. Deine version hat nicht funktioniert, weil es fehlte die%
- Zeichen in den Befehl übergebenxargs
.Für was es Wert ist, würde ich verwenden Sie diesen Befehl, um die gleiche Sache:
weil es einfacher (
parallel
automatisch verwendet{}
als die substitution Charakter und können mehrere Befehle standardmäßig).InformationsquelleAutor
Was zu schreiben, Ihre eigene bash-Funktion?
InformationsquelleAutor
In diesem speziellen Fall wird jeder Befehl ausgeführt wird, für jede einzelne Datei sowieso, also gibt es keinen Vorteil bei der Verwendung von xargs. Sie können nur anfügen exec zweimal, um Ihre 'zu finden':
In diesem Fall
-print
könnte verwendet werden, anstelle der erstenecho
wie bereits von rici, aber dieses Beispiel zeigt die Fähigkeit zum ausführen von beliebigen Befehlen mit einem einzigenfind
InformationsquelleAutor