find -exec

H

Hello World

Routinier
Hallo,

Mit find ... -exec <irgendwas> \; kann man ja für jede durch find gefundene Datei einen Befehl ausführen lassen. Leider habe ich bisher keine Möglichkeit gefunden, in diesen Befehlen Backticks oder Pipes einzubauen. Also wenn ich mich z. B. durch alle Textdateien greppen will:
find . -iname "*.txt" -exec cat {} | grep foo \;
(Anm.: das ist nur ein Beispiel um das Problem zu erklären, ich weiß wie man es normalerweise machen würde)
Das funktioniert aber nicht. Wenn ich das |-Zeichen nicht escape, denkt die shell, ich möchte die Ausgabe von find in grep umleiten. Wenn ich es escape, denkt find, es solle cat das |-Zeichen als zweites Argument übergeben, was natürlich beides Unfug ist, bzw. nicht das, was ich will. Kennt jemand einen Ausweg?
 
Hallo
Die einfachste Lösung ist dahinter eine Pipe mit while read einzubauen.
Das schützt zugleich vor zu vielen Argumenten.

Gruß Wolfgang
 
Moin,

Was ist hiermit: find . -name '*' -type f -exec grep -H '\gesuchte-wort' '{}' ';'

Gruß
Ragnar
 
Hallo
Wenn ich das richtig verstanden habe, ging es nicht um das genannte Beispiel mit grep.
In diesem ist ja ohnehin das typische "useless use off cat" gegeben.
Code:
#Das ist sinnlos
cat datei |grep "Pattern"
#weil das genau das Gleiche macht
# aber nur einen Prozess braucht
grep "Pattern" datei

Mehrere exec machen keinen Sinn, da du diese auch gleich hinter find als Pipe oder Schleife oder... anfügen kannst.

Code:
find /path -type f -exec grep "pattern" {} \,
#das Gleiche Ergebnis
find /path -type f |grep "pattern"
Hier lassen sich beliebige Pipe's (Hmm Mehrzahl von Pipe ... Pipelines ;) )
anfügen.
Andere Variante mit while read, oder ...
Code:
for I in $(find....); do 
...
done

Dann geht natürlich auch noch ein Script per exec ausführen zu lassen.

Ich hoffe wir haben alles zusammen.

Gruß Wolfgang
 

Ähnliche Themen

Open-Xchange auf OpenSuse mit Commu. Installer - Compiler Fehler

Zurück
Oben