grep nur Unterverzeichnisse, die dem Muster entsprechen

9

Ich habe einen Verzeichnisbaum, der aus mehreren tausend Unterverzeichnissen besteht, aber ich muss häufig nur eine kleine Teilmenge dieser Verzeichnisse durchsuchen. Wie kann ich grepnur die Unterverzeichnisse verwenden, die einem Muster entsprechen?

Angenommen, ich habe diese Unterverzeichnisse, in denen ich greifen möchte:

...
...
...
/foo
/fooLib
/fooHandler
/fooGizmo
...
...
...

Die ...obigen Einträge repräsentieren die Tausenden anderer Verzeichnisse, in denen ich nicht greifen möchte.

Angenommen, ich suche nach allen Instanzen von bar, wenn ich dies tue:

grep -n --recursive bar *

Ich würde finden, wonach ich suche, aber in allen Verzeichnissen. Wie kann ich nur in den Unterverzeichnissen suchen, die dem Muster entsprechen foo*?

John Dibling
quelle
Möchten Sie nur in /foound Freunde suchen ? In /foound /foo/barund /foo/bar/quxund so weiter aber nicht /wibble/foo? In /foound /wibble/fooaber nicht /foo/bar? In /foound /foo/barund /wibble/fooaber nicht /elsewhere?
Gilles 'SO - hör auf böse zu sein'

Antworten:

11

Sie können grep verwenden und die Kombination wie folgt finden:

find /{foo,fooLib,fooHandler,fooGizmo} -type f -exec grep -l "test" {} \;

Oder Sie können verwenden

find /foo* -type f -exec grep -l "test" {} \;

Oder nur mit grep

grep -R "test" /foo*
Rahul Patil
quelle
Kann ich dies tun, ohne die Unterverzeichnisse explizit anzugeben? Verwenden Sie stattdessen einen Platzhalter wie foo*?
John Dibling
@ JohnDibling ja, ich habe genau aktualisiert, was Sie sagen :)
Rahul Patil
Der letztere Vorschlag ( grep -R "test" /foo*) ist genau das, was ich gerade mache, also werde ich akzeptieren.
John Dibling
Danke dafür. Ich verwende das erste Muster, würde aber gerne ein paar Dinge darüber verstehen - zum Beispiel, was machen das Ende {}und der Backslash?
random_user_name
Dadurch werden die Zeilen bereitgestellt, die mit dem grep übereinstimmen, aber der Speicherort der Daten (die Datei, in der sie sich befinden) geht verloren. Gibt es eine Möglichkeit, das beizubehalten?
Jontia
0

versuchen Sie grep foo* <other parts>zB:grep foo* -name "book*"

harish.venkat
quelle
Wenn ich nach allen Instanzen barin allen Dateien in den genannten Unterverzeichnissen suche foo*, sollte dies folgendermaßen aussehen : grep --recursive bar ./foo*/*?
John Dibling