Mailinglist Archive: opensuse-de (5177 mails)

< Previous Next >
Re: find | grep
  • From: Adalbert Michelic <adalbert+list@xxxxxxxx>
  • Date: Tue, 24 Jun 2003 18:53:52 +0200
  • Message-id: <20030624165352.GK27187@xxxxxxxxxxxxx>
* On Tue, 24 Jun 2003 at 17:55 +0200, Axel Heinrici wrote:
[...]
Naja, da kommen dann aber nur die Zeilen aus irgendwelchen Dateien raus
die "egal" enthalten. Ich vermute mal, dass da aber die Dateinamen der
Dateien die "egal" enthalten rauskommen soll.

find ./ -name '*.txt' -exec grep -q egal {} \; -exec echo {} \;

Da kommen dann die Dateinamen raus die find gefunden hat und bei denen
grep "egal" gefunden hat.
grep -q testet ob egal in der Datei enthalten ist und gibt nur einen
Rückgabewert und keine Ausgabe auf stdout. Das echo wird nur
ausgeführt, wenn der erste grep Erfolgreich war.

Das geht auf jeden Fall eine Möglichkeit; aber bei sehr vielen
Dateien ein wenig langsam, da sehr viele Prozesse gestartet werden -
das kostet ein wenig Zeit.

grep kann schon von sich aus nur die Namen der passenden Dateien
ausgeben - mit dem Parameter '-l':

find ./ -name '*.txt' -exec grep -l egal {} \;

Ausserdem kann mit xargs die Prozessflut noch ein wenig eingedämmt
werden:

find ./ -name '*.txt' | xargs grep -l egal

xargs fasst mehrere Aufrufe und grep zu einem einzigen Aufruf
zusammen; es werden dabei jeweils so viele Dateinamen als möglich
zusammnen übergeben. Diese Variante hat aber noch ein Problem, wenn
ein Dateiname Leerzeichen o.ä. enthält, der würde von xargs auf 2
aufgespalten. Besser ist es, die Dateinamen mit einem Nullwert zu
trennen:

find ./ -name '*.txt' -print0 | xargs -0 grep -l egal


/apm
--
GPG welcome, request public key: mailto:adalbert+key@xxxxxxxx

< Previous Next >
Follow Ups