ubuntuusers.de

Dateien durchsuchen?

Status: Ungelöst | Ubuntu-Version: Server 11.04 (Natty Narwhal)
Antworten |

pfannkuchen

Anmeldungsdatum:
7. Januar 2007

Beiträge: 378

Hi,

ich habe hier einen Ordner mit vielen Tausend quelltext files. Mein Problem ist, dass ich das file und die Zeile suche in der folgendes vorkommt:

1
evtimer_add(&ur->timeout

Versucht habe ich das ganze herauszufinden so:

1
find . -type f -exec grep -qi "evtimer_add(&ur->timeout" {} \; -print

Leider finder er nix. Ich bin mir aber zu 1000% Sicher das das file da sein muss!

Hat jemand eine Idee, ob ich irgendwas an dem Befehl falsch mache?

Grüße,

Pfannkuchen

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Taste Dich doch mal langsam ran... vielleicht erst einmal bis zur Klammer auf?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13224

pfannkuchen schrieb:

Hi,

ich habe hier einen Ordner mit vielen Tausend quelltext files. Mein Problem ist, dass ich das file und die Zeile suche in der folgendes vorkommt:

1
evtimer_add(&ur->timeout

Versucht habe ich das ganze herauszufinden so:

1
find . -type f -exec grep -qi "evtimer_add(&ur->timeout" {} \; -print

Leider finder er nix. Ich bin mir aber zu 1000% Sicher das das file da sein muss!

Hat jemand eine Idee, ob ich irgendwas an dem Befehl falsch mache?

Je nach grep sind da Metazeichen im String. Ich würde für sowas fgrep benutzen:

1
find . -type f -exec fgrep -li 'evtimer_add(&ur->timeout' '{}' +

Mit -l sagst Du (f)grep, dass er nur die Namen von Dateien ausgibt, die Treffer haben.

Ciao

robert

fckawe

Avatar von fckawe

Anmeldungsdatum:
23. April 2011

Beiträge: 509

Wohnort: Freiburg im Breisgau

Hi Pfannkuchen,

ich würde folgendes vorschlagen:

grep -rn "evtimer_add(&ur->timeout" *

Die Option -r sorgt für rekursives Suchen - das find kannst du dir dann sparen. Die Option -n gibt an, dass du neben dem Dateinamen auch noch die Zeilennummer ausgegeben bekommen möchtest. Das -i brauchst du nur, wenn du dir wegen der Groß-/Kleinschreibung nicht sicher bist.

Wobei Robert natürlich Recht hat, wenn er sagt, dass das je nach Suchstring Probleme machen könnte - wenn Zeichen enthalten sind, die bei Regular Expressions spezielle Bedeutungen haben... Mit deinem String hat es bei mir bei einem kleinen Versuch aber funktioniert.

Gruß, Gerald

pfannkuchen

(Themenstarter)

Anmeldungsdatum:
7. Januar 2007

Beiträge: 378

Hmm irgendwas kann da nicht stimmen!

wenn ich zum beispiel das hier ausführe: grep -rn "evtimer" *

dann findet er auch nix. Das kann leider nicht stimmen, denn ich weis aus dem kopf das mindestens 10 files diesen String beinhalten! (hab ich auch nachgeseehn....

Grüße,

Pfannkuchen

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13224

pfannkuchen schrieb:

Hmm irgendwas kann da nicht stimmen!

wenn ich zum beispiel das hier ausführe: grep -rn "evtimer" *

dann findet er auch nix. Das kann leider nicht stimmen, denn ich weis aus dem kopf das mindestens 10 files diesen String beinhalten! (hab ich auch nachgeseehn....

Wie hast Du denn nachgesehen?

Jetzt hast Du aber -i weggelassen. War das Absicht? Suchst Du auch sicher im richtigen Verzeichnis? Versuch doch noch mal

$ fgrep -r -i evtimer .

Ciao

robert

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Beim testen ist mir noch etwas aufgefallen: Du solltest besser ein "–" einfügen. Damit Dateinamen, die mit "-" anfangen, kein Problem machen:

grep -rn 'evtimer_add(&ur->timeout' -- *

... und auf jeden Fall mit einfachen Gänsefüßchen, damit die Shell da ja nichts heruminterpretiert.

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17625

Wohnort: Berlin

grep -rn 'evtimer_add(&ur->timeout' – *

-i ist bei Quellcode, wo es auf die Groß/Kleinschreibung ankommt, aber selten nötig.

Dagegen sieht es wie C oder C++ - Code aus, und da wäre dann Whitespace optional möglich:

1
egrep -rn 'evtimer_add ?(&ur->timeout' -- *

oder hälst Du Dich (oder wer sich) streng an bestimmte Code-Konventionen? Wo sonst überall Whitespace erlaubt wäre, womöglich mehr als nur ein Blank benutzt wurde, oder Tabs, ... - das könnte man noch alles probieren, um bei Zeilenumbrüchen dann wirklich in die Bredouille zu kommen.

1
egrep -rn 'evtimer_add ?( ?&ur ?-> ?timeout' -- *
Antworten |