it-swarm.com.de

Wie kann ich die Ergebnisse von FIND mit -EXEC erfassen und trotzdem in eine Datei ausgeben?

Besser anhand von Beispielen erklären.

Ich kann:

find . -name "*.py" -type f > output.txt

Aber wie kann ich die Ausgabe in derselben Datei speichern für:

find . -name "*.py" -type f -exec grep "something" {} \

Ich kann es nicht einfach machen

find . -name "*.py" -type f -exec grep "something" {} \ > output.txt
75
bakytn

Wenn ich Sie richtig verstehe, möchten Sie Folgendes tun:

find . -name '*.py' -print0 | xargs -0 grep 'something' > output.txt

Find alle Dateien mit der Erweiterung py, grep nur Zeilen, die something enthalten, und speichern Sie die Zeilen in output.txt. Wenn die Datei etwas enthält, wird sie ersetzt.

Bearbeiten: Mit -exec:

find . -name '*.py' -exec grep 'something' {} \; > output.txt

Ich nehme hier den Kommentar von Chris Downs auf. Der obige Befehl führt dazu, dass grep so oft ausgeführt wird, wie find Vorkommen findet. Wenn Sie jedoch das ; mit einer +, grep wird aufgerufen, wobei die Ausgabe von find verkettet wird (bis zu einem bestimmten Grenzwert). Weitere Informationen zu diesem Thema finden Sie in Frage Verwenden von Semikolon (;) vs plus (+) mit exec in find .

119
johnny

Wenn Sie alle übereinstimmenden Zeilen in allen Dateien in output.txt, Ihr letzter Befehl funktioniert, außer dass Sie das erforderliche ; am Ende des Befehls.

find . -name "*.py" -type f -exec grep "something" {} \; > output.txt

Wenn Sie möchten, dass jeder Lauf von grep eine Ausgabe in eine andere Datei erzeugt, führen Sie eine Shell aus, um den Namen der Ausgabedatei zu berechnen und die Umleitung durchzuführen.

find . -name "*.py" -type f -exec sh -c 'grep "something" <"$0" >"$0.txt"' {} \;

Für den Datensatz hat grep--include und --exclude Argumente, mit denen Sie die durchsuchten Dateien filtern können:

grep -r --include="*.py" "something" > output.txt
10
hunse

Verwenden Sie tee:

find . -name '*.py' | tee output.txt | xargs grep 'something'

Die Einschränkung ist, wenn Sie Dateien mit Sonderzeichen (einschließlich Leerzeichen) haben, mit denen xargs und grep nicht gut funktionieren (a file.txt Wird als zwei Dateien interpretiert). a und file.txt). Die Alternative dazu besteht darin, entweder -x Oder -print0 Zu verwenden, aber beide verschmutzen Ihren output.txt. Das -x Verwendet \, Um bestimmten Sonderzeichen zu entkommen, und dies wird in output.txt Sein. Das -print0 Verwendet ein Null-Byte als Feldtrennzeichen (was auch xargs -0 Erfordert) und output.txt Sieht aus wie eine lange zusammenhängende Textzeile.

Wie Sie damit umgehen (oder nicht), liegt bei Ihnen.

2
bahamat
grep -n CThread '`find . -name "*.cpp"`'
1
turningeagle