ubuntuusers.de

Alle Dateien eines Verzeichnisses nach Dateiinhalten durchsuchen

Status: Ungelöst | Ubuntu-Version: Ubuntu 9.10 (Karmic Koala)
Antworten |

balert

Anmeldungsdatum:
10. August 2009

Beiträge: 43

hallo,

ich stand schon öfter vor der Problematik wie im Titel beschrieben und konnte mit den Manpages und dem Wiki leider noch keine vernünftige Lösung finden. Ich würde gerne mit einer Kombination aus Bash-Befehlen einen Ordner und dessen Unterordner nach einem bestimmten String - nehmen wir an "require("lib.php");" - durchsuchen. Sprich ich möchte in meinem PHP-Projekt die Datei finden die diesen String enthält. Optimal wäre wenn gleich die Zeilennummer noch dabei wäre, aber das ist Luxus 😀

Linux Profis ans Werk 😉

scrawl

Anmeldungsdatum:
12. Dezember 2007

Beiträge: 1779

Muss es denn unbedingt Shell sein? Die GNOME-Suche (Orte->Nach Dateien suchen) kann das auch (Weitere Einstellungen → Enthält den Text)

Lunar

Anmeldungsdatum:
17. März 2006

Beiträge: 5792

grep -r suchmuster verzeichnis 

balert

(Themenstarter)

Anmeldungsdatum:
10. August 2009

Beiträge: 43

@scrawl: Tatsache, die Gnome Suche kann das *Kopf-gegen-die-Wand*. Danke auf jedenfall mal!!! Jetzt gehts mir nur noch ums Interesse. Würd das schon gern mit der Bash können 😉 auf Servern wo ich kein Gnome habe zum Beispiel.

@Lunar: mit 'grep -r "$messages" /opt/hallo/dings' konnte ich leider nicht das gewünschte Ergebnis erreichen.

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17621

Wohnort: Berlin

find /opt/hallo/dings -name "*.php" -exec grep -n 'require("lib.php");' {} \; -print

-n gibt die zeilenNummer aus.

g0ju

Avatar von g0ju

Anmeldungsdatum:
5. Februar 2007

Beiträge: Zähle...

balert schrieb:

@Lunar: mit 'grep -r "$messages" /opt/hallo/dings' konnte ich leider nicht das gewünschte Ergebnis erreichen.

Das liegt daran, dass du das $ escapen , also \$ dafür schreiben musst.

grep -r -n "\$messages" <pfad>

Sid_Burn

Anmeldungsdatum:
23. Oktober 2004

Beiträge: 2159

balert schrieb:

@Lunar: mit 'grep -r "$messages" /opt/hallo/dings' konnte ich leider nicht das gewünschte Ergebnis erreichen.

Das liegt daran weil das Suchmuster eine Regex ist und Sonderzeichen wie "(" besonders behandelt werden. Ich würde dir allerdiengs eher "ack" ans herz legen (Packet: ack-grep). Das geht schon automatisch rekursiv die Dateien vom aktuellen Verzeichnis durch und gibt Dateiname und Zeilennummer per default aus. Wenn du nach Literalen Text suchst musst du alle Sonderzeichen vorher mit einem Backslash escapen oder bei ack gibt es noch die Option "-Q" womit der Suchstring wie Text und nicht wie eine Regex behandelt wird.

ack -Q 'require("lib.php");'

Möchtest du nur PHP Dateien durchsuchen dann kannst du noch "--type=php" hinzufügen

ack 'require("lib.php");' --type=php

Ansonsten wenn du den Inhalt einer Variablen matchen möchtest also den Inhalt von $message und der Inhalt von $message Literal also keine Regex sein soll musst du ebenfalls "-Q" hinzufügen.

ack -Q "$message" --type=php
sidburn@sid:~/perl$ echo $message
require("lib.php")
sidburn@sid:~/perl$ ack -Q "$message" --type=php
php.php
1:require("lib.php");
Antworten |