Ich möchte alle Dateien finden, die eine bestimmte Textfolge enthalten. Der grep
Befehl funktioniert, aber ich kann ihn nicht für jedes Verzeichnis verwenden (ich kann ihn nur für mein aktuelles Verzeichnis ausführen). Ich habe versucht zu lesen man grep
, aber es brachte keine Hilfe.
command-line
grep
Smile.Hunter
quelle
quelle
--include="*.C"
Option @ user311346 dank @Lekensteyn.Antworten:
Es wäre besser zu benutzen
wo
-r
(oder--recursive
) Option wird verwendet, um auch alle Unterverzeichnisse von zu durchlaufen/path
, wohingegen-l
Die--files-with-matches
Option (oder ) wird verwendet, um nur die Dateinamen der übereinstimmenden Dateien und nicht die übereinstimmenden Zeilen zu drucken (dies könnte auch die Geschwindigkeit verbessern, da dasgrep
Lesen einer Datei bei der ersten Übereinstimmung mit dieser Option beendet wird).quelle
-rlF
Schalter verwenden,-F
für "feste Zeichenfolge" (und nicht regexp - zum Beispiel). Natürlich, wenn die Aufgabe Regexps verwendet hat, dann entschuldigen Sie mich. Klar, die gleiche Theorie ohne -r auch, ich sehe oft, dass die Leute Grep-Suchen "Text" annehmen und es Probleme verursachen kann, welche speziellen, die etwas als Regexp bedeuten.-i
Flag, das Groß- und Kleinschreibung ignoriert.--recursive
Option zeigen , es gibt Tonnen von Optionen und Nutzungsszenarien, über die man sprechen kann. Ich begann mit der von @dmityugov akzeptierten Antwort und änderte sie, um ohne zu arbeitenfind
.--include '*.h'
Wenn Sie nach übereinstimmenden Zeilen in Dateien suchen, lautet mein Lieblingsbefehl:
-H
bewirkt, dass der Dateiname gedruckt wird (impliziert, wenn mehrere Dateien durchsucht werden)-r
führt eine rekursive Suche durch-n
bewirkt, dass die Zeilennummer gedruckt wirdpath/to/files
kann sein.
, im aktuellen Verzeichnis zu suchenWeitere Optionen, die ich sehr nützlich finde:
-I
Binärdateien ignorieren (Ergänzung:-a
Alle Dateien als Text behandeln)-F
search term
als wörtlicher Ausdruck behandeln , nicht als regulärer Ausdruck-i
Suche ohne Berücksichtigung der Groß- / Kleinschreibung--color=always
Erzwingen von Farben, auch wenn diese durchgeleitet werdenless
. Umless
Unterstützungsfarben zu erstellen, müssen Sie die-r
Option verwenden:--exclude-dir=dir
nützlich zum Ausschließen von Verzeichnissen wie.svn
und.git
.quelle
-H
auf einem Ordner ist redundant, wenn es mehr als eine Datei gibt, wie es wahrscheinlich ist. Tatsächlich steht auf der Manpage-H, --with-filename: Print the file name for each match. This is the default when there is more than one file to search.
--include '*.*'
grep --exclude='*~' ...
Ich glaube, Sie können so etwas verwenden:
Erklärung aus Kommentaren
find
ist ein Befehl, mit dem Sie Dateien und andere Objekte wie Verzeichnisse und Verknüpfungen in Unterverzeichnissen eines bestimmten Pfads finden können. Wenn Sie keine Maske angeben, der Dateinamen entsprechen sollen, werden alle Verzeichnisobjekte aufgelistet.-type f
Gibt an, dass nur Dateien, keine Verzeichnisse usw. verarbeitet werden sollen.-exec grep
Gibt an, dass für jede gefundene Datei der Befehl grep ausgeführt werden soll, wobei der Dateiname als Argument übergeben wird, indem er{}
durch den Dateinamen ersetzt wirdquelle
-name '*.py'
beschränkt das Hinzufügen die Übereinstimmungen auf Dateien, die mit ".py" enden.... -exec bash -c 'grep -r "mystring" {} && echo {}' \;
Mein Standardbefehl ist
Ich benutze ein Kapitol 'R', weil
ls
es rekursiv verwendet wird. Da grep beides akzeptiert, gibt es keinen Grund, es nicht zu benutzen.EDIT: per HVNSweeting werden anscheinend symlinks
-R
folgen wo wie-r
nicht.quelle
shopt -s dotglob
(merken Sie sich-s
als "set"). Seien Sie vorsichtig, wenn Sie Dateien entfernen. Wenn Sie dotglob aktiviert haben,rm -r *
wird alles aus dem aktuellen Verzeichnis entfernt, aber auch das darüber liegende Verzeichnis, da es..
übereinstimmt. Verwenden Sieshopt -u dotglob
("unset"), um dotglob zu deaktivieren . Die Änderungen sind jedoch nur vorübergehend und gelten nur für die aktuelle Shell.shopt -s dotglob & <grep cmd> & shopt -y dotglob
nur bequemer? Auf diese Weise müssen wir uns keine Gedanken über das Zurücksetzen machengrep -Rin string .
In den meisten Fällen ist die Verwendung wahrscheinlich einfacher . Ich benutze nur *, weil es natürlicher zu kommen scheint.R
wird symbolische Links folgen,r
nichtWenn Sie bereit sind, etwas Neues auszuprobieren, probieren Sie es aus
ack
. Der Befehl zum rekursiven Durchsuchen des aktuellen Verzeichnissesstring
lautet:Die Installation ist ganz einfach:
(Vorausgesetzt, Sie haben das Verzeichnis bereits
~/bin
und es befindet sich vorzugsweise in IhremPATH
.)quelle
chmod
Befehls? Sind sie spezifisch fürchmod
oder sind sie verwandt mit Bash (dem!#:3
Teil)?!
ist ein Ereignisbezeichner . Sie sind ziemlich mächtig, um Wiederholungen zu vermeiden.!#:3
verweist bisher auf das dritte Token der Kommandozeile, also~/bin/ack
in diesem Fall.Der Befehl rgrep ist für diesen Bedarf vorgesehen
Wenn nicht verfügbar, können Sie es so erhalten
Sie können Ihre Standard-Grep-Optionen wie oben beschrieben direkt festlegen.
Ich persönlich benutze
verwandtes thema : wie man rgrep immer mit farbe benutzt
quelle
Update 2:
Diese Befehlszeile verwendet
find
undgrep
behebt das Problem:--color=<always or auto>
für farbige Ausgabe:Beispiel:
Ein Beispiel für den folgenden Schnappschuss:
Update 1:
Sie können versuchen, folgenden Code zu verwenden. als Funktion in Ihrem
.bashrc
oder.bash_aliases
oder in einem Skript:Verwendungszweck:
wherein /path/to/search/in/ searchkeyword
Beispiel:
(Hinweis: Wie in den Kommentaren unten von @enzotib vorgeschlagen, funktioniert dies nicht mit Dateien / Verzeichnissen, in deren Namen Leerzeichen enthalten sind.)
Ursprünglicher Beitrag
So suchen Sie nach der Zeichenfolge und geben nur diese Zeile mit der Suchzeichenfolge aus:
z.B:
So zeigen Sie den Dateinamen an, der die Suchzeichenfolge enthält:
z.B:
quelle
grep
, daneben die Teilmenge, diefind
mitgrep
... verwendet wird. Wenn Sie jedoch verschiedene Schalter und Optimierungen als eindeutige Antwort akzeptieren möchten, wahrscheinlich wird meins auch hier reinpassen .. oder unterscheiden sie sich? das letzte update macht was ich bei meiner suche möchte: dateinamen mit zeilen mit suchschlüssel und zeilen nr. Auch :) und farbige Ausgabe und Fehlerfilter für bessere Lesbarkeit ..grep
( GNU oder BSD )Sie können das
grep
Tool verwenden, um den aktuellen Ordner rekursiv mit-r
Parametern zu durchsuchen , z.Hinweis:
-r
- Durchsuchen Sie Unterverzeichnisse rekursiv.Zum Durchsuchen bestimmter Dateien können Sie eine Globbing-Syntax verwenden, z.
Hinweis: Mit der Globbing-Option (
**
) werden alle Dateien mit einer bestimmten Erweiterung oder einem bestimmten Muster rekursiv durchsucht. Um diese Syntax zu aktivieren, führen:shopt -s globstar
. Sie können auch**/*.*
für alle Dateien (außer versteckt und ohne Erweiterung) oder jedes andere Muster verwenden.Wenn Sie den Fehler haben, dass Ihr Argument zu lang ist, können Sie die Suche eingrenzen oder
find
stattdessen die folgende Syntax verwenden:Alternativ verwenden
ripgrep
.ripgrep
Wenn Sie an größeren Projekten oder großen Dateien arbeiten, sollten Sie
ripgrep
stattdessen Folgendes verwenden:Überprüfen Sie die Dokumente, Installationsschritte oder den Quellcode auf der GitHub-Projektseite .
Es ist viel schneller als jedes anderes Tool wie GNU / BSD
grep
,ucg
,ag
,sift
,ack
,pt
oder ähnlich, da es auf der Spitze gebaut Rust Regex - Engine , die endlichen Automaten verwendet, SIMD und aggressive wörtliche Optimierungen sehr schnell zu machen suchen.Es werden in
.gitignore
Dateien angegebene Ignoriermuster unterstützt , sodass ein einzelner Dateipfad gleichzeitig mit mehreren Glob-Mustern abgeglichen werden kann.Sie können die allgemeinen Parameter verwenden, z.
-i
- Unempfindliche Suche.-I
- Ignorieren Sie die Binärdateien.-w
- Suche nach ganzen Wörtern (im Gegensatz zur Teilwortübereinstimmung).-n
- Zeigen Sie die Zeile Ihres Spiels.-C
/--context
(eg-C5
) - Vergrößert den Kontext, sodass Sie den umgebenden Code sehen.--color=auto
- Markieren Sie den passenden Text.-H
- Zeigt den Dateinamen an, in dem sich der Text befindet.-c
- Zeigt die Anzahl der übereinstimmenden Zeilen an. Kombinierbar mit-H
.quelle
Ich mache das mit xargs, einem sehr unterschätzten Befehl
Mit find ./ erhalten Sie eine rekursive Liste aller Dateien in einem aktuellen Ordner. Anschließend leiten Sie diese Liste an xargs weiter, das den Befehl grep für jede dieser Dateien ausführt
quelle
xargs
ohne die-print0
Option tofind
und die-0
Option to nicht mehr weiterentwickelnxargs
, schlägt dies bei Dateinamen fehl, die Leerzeichen enthalten.Ich weiß, dass es hier viele Antworten gibt, aber hier ist eine Alternative, wenn Sie beim Durchsuchen der Dateien weitere Einschränkungen hinzufügen möchten:
Dies funktioniert, weil
grep
0 zurückgegeben wird, wenn ein Ergebnis gefunden wurde, andernfalls 1. Zum Beispiel können Sie Dateien 1 MB groß finden und enthält etwas:Für mehrere Anforderungen möchten Sie wahrscheinlich das Optimierer-Flag verwenden
-O
, das in GNU grep vorhanden ist.quelle
Ein Skript (Find-In-Code) zum Suchen in C, CPP-Code:
Verwenden:
quelle