Mailinglist Archive: opensuse-de (5177 mails)

< Previous Next >
Re: find | grep
  • From: Henning Hucke <h_hucke@xxxxxxxxxxxxxxxx>
  • Date: Thu, 26 Jun 2003 00:04:51 +0200 (CEST)
  • Message-id: <Pine.LNX.4.56.0306252013500.16640@xxxxxxxxxxxxxxxx>
*** Horst Jäger (h.jaeger@xxxxxxxxxxxxxxxxx) schrieb am Jun 24, 2003 in...:

[...]
irgendwas kriege ich hier nicht auf die Reihe: wenn ich alle Dateien suchen
will, die z.B. mit ".txt" aufhören und "egal" enthalten, geht das nicht mit
find / -iname "*.txt" | grep egal , weil das die gelieferten Pfade
durchsuchen würde und also alles liefert, was mit ".txt" aufhört und im
Pfad irgendwo "egal" enthält. So weit kapier ich noch alles.

Ähmmm... Nein!

"find / -iname "*.txt" | grep egal" liefert Dir mit find alle file names
unterhalb des root directory, die auf ".txt" enden. Dieser Output, die
Namen der Files, wird in grep gepipet. grep such in diesem *Namen* (!)
nach der Zeichenfolge "e" "g" "a" "l".

Wenn es das ist, was Du willst, hast Du die Lösung. Wenn Du, wie Du in
einer anderen Mail geschrieben hat, alle file names haben möchtest, die
auf ".txt" enden und in ihrem Namen _oder_ ihrem Inhalt das Wort "egal"
enthalten, sieht die Sache in etwa so

find / -type f -iname "*.txt" \( -iname "*egal*" -or -exec egrep -q
'\<egal\>' {} \; \) -print

aus.

Wenn Dir nicht klar ist, wie "-exec" den Befehl auswertet / auswerten
kann, dann

lies die man page!

Legende:
- Sowas wie "-type f -iname \"*.txt\"" bedeutet eigentlich "-type f \
-and -iname \"*.txt\""!
- "-type f" sucht nur in files, nicht in directories ua., weil grep
nicht auf das gewünschte Kriterium den gewünschten return code
liefern würde.
- "-iname \"*.txt\"" stellt - mittels *globbing* - sicher, dass der
file name auf jeden Fall mit ".txt" endet.
- "\(" gruppiert, wie in der Logik auch.
- "-iname \"*egal*\"" stellt sicher, dass der file name "egal"
enthält und ...
- "-exec egrep -q '\<egal\>' {}", dass *alternativ* (mind the "-or"!)
"egal" als einzelnes Wort _in_ dem file gefunden wird.
- Last but not least bewirkt "-print", dass der file name eines files,
auf das alle Kriterien zutreffen, ausgegeben wird.

Warum geht es aber nicht mit find / -iname "*.txt" | cat | grep egal ?

"find / -iname \"*.txt\"" findet alle file, directory, link und device
names, die auf ".txt" enden, cat gibt alles das aus, was es auf seinem
stdin bekommt (da es keinen file name vorgegeben bekommen hat) und grep
sucht in diesen file names nach der Zeichenkette "egal". Da in diesem
Fall "cat" nur einfach das auf stdout ausgibt, was es auf stdin gekommt,
kannst Du es auch gleich weglassen.

Meine Frage ist eigentlich zweiteilig:

1. Wie suche ich Dateien, die z.B. mit ".txt" aufhören und "egal" enthalten?

find / -type f -iname "*.txt" -exec egrep -q '\<egal\>' {} \; -print

wenn Du mit "enthalten" nicht "enthalten im file name", sondern "in
seinem Inhalt enthalten" meinst.

2. Warum klappt das mit cat nicht? Insbesondere: warum verkettet mir find /
-iname "*.txt" | cat nicht einfach die Inhalte aller Dateien, die mit
".txt" aufhören?

Das würde

find / -type f -iname "*.txt" -exec cat {} \;

leisten. Aber dann gehen Dir die file name informationen verloren.

[...]

Engagiert _mich_! Dann brauchst Du Dir um solche Späße keine Sorgen mehr
zu machen...

MG Henning Hucke
--
"... die Aussage 'C-Programme sind portabel' ist lächerlich und nicht
haltbar, ..."
Jan Ritzerfeld in <zp0e60aAXvDyZ7c@xxxxxxxxxxxxxxxxxxxx>

< Previous Next >
References