Ich versuche einen Weg zu finden, mein gesamtes Linux-System nach allen Dateien zu durchsuchen, die eine bestimmte Textzeichenfolge enthalten. Zur Verdeutlichung suche ich nach Text in der Datei, nicht im Dateinamen.
Als ich nachgeschlagen habe, wie das geht, bin ich zweimal auf diese Lösung gestoßen:
find / -type f -exec grep -H 'text-to-find-here' {} \;
Es funktioniert jedoch nicht. Es scheint jede einzelne Datei im System anzuzeigen.
Ist dies nahe an der richtigen Vorgehensweise? Wenn nicht, wie soll ich? Diese Fähigkeit, Textzeichenfolgen in Dateien zu finden, wäre für einige Programmierprojekte, die ich mache, außerordentlich nützlich.
.
unter anderem jeden als Platzhalter mit einem Zeichen interpretiert . Mein Rat ist, immer entweder fgrep oder egrep zu verwenden.-H
mit-l
(und vielleicht auchgrep
mitfgrep
). Um Dateien mit bestimmten Namensmustern auszuschließen, würden Sie diesefind
auf fortgeschrittenere Weise verwenden. Es lohnt sich jedoch zu lernen, wie man es benutztfind
. Einfachman find
.find … -exec <cmd> +
ist einfacher zu tippen und schneller alsfind … -exec <cmd> \;
. Dies funktioniert nur, wenn<cmd>
eine beliebige Anzahl von Dateinamenargumenten akzeptiert wird. Die Einsparung an Ausführungszeit ist besonders groß, wenn<cmd>
der Start wie bei Python- oder Ruby-Skripten langsam ist.grep "pattern" path/*.txt
Antworten:
Mach Folgendes:
-r
oder-R
ist rekursiv,-n
ist die Zeilennummer und-w
steht für Match das ganze Wort.-l
(Kleinbuchstabe L) kann hinzugefügt werden, um nur den Dateinamen der übereinstimmenden Dateien anzugeben.Zusammen mit diesen
--exclude
,--include
,--exclude-dir
könnten Flaggen für die effiziente Suche verwendet werden:Dadurch werden nur die Dateien durchsucht, die die Erweiterungen .c oder .h haben:
Dies schließt die Suche nach allen Dateien aus, die mit der Erweiterung .o enden:
Bei Verzeichnissen ist es möglich, ein bestimmtes Verzeichnis (bestimmte Verzeichnisse) über
--exclude-dir
Parameter auszuschließen . Dies schließt beispielsweise die Verzeichnisse dir1 /, dir2 / und alle aus, die mit * .dst /: übereinstimmen.Dies funktioniert sehr gut für mich, um fast den gleichen Zweck wie Ihren zu erreichen.
Weitere Optionen finden Sie unter
man grep
.quelle
r
Option faul ist (zuerst die Tiefe durchläuft, dann nach dem ersten Verzeichnis stoppt), während sieR
gierig ist (den gesamten Baum korrekt durchläuft).R
enr
durchläuft beide Verzeichnisse korrekt,R
folgt jedoch symbolischen Links.Sie können verwenden
grep -ilR
:i
steht für Ignorieren der Groß- / Kleinschreibung (in Ihrem Fall optional).R
steht für rekursiv.l
steht für "zeige den Dateinamen, nicht das Ergebnis selbst"./
steht für das Starten an der Wurzel Ihrer Maschine.quelle
-i
verlangsamt sich das sehr, also benutze es nicht, wenn es nicht nötig ist. Testen Sie es in einem bestimmten Verzeichnis und verallgemeinern Sie es dann. Es sollte innerhalb weniger Minuten abgeschlossen sein. Ich denke, ein regulärer Ausdruck würde es langsamer machen. Aber meine Kommentare basieren auf Vermutungen. Ich empfehle Ihnen, sietime
vor der Leitung zu testen ./*
steht dafür. Jedenfalls habe ich es gerade getestet und festgestellt, dass es einfach/
funktioniert.fgrep is the same as grep -F -> Interpret PATTERN as a list of fixed strings
.grep -Ril "text-to-find-here" ~/sites/
oder verwenden. für aktuelles Verzeichnisgrep -Ril "text-to-find-here" .
Sie können ack verwenden . Es ist wie grep für Quellcode. Sie können damit Ihr gesamtes Dateisystem scannen.
Mach einfach:
In Ihrem Stammverzeichnis.
Sie können auch reguläre Ausdrücke verwenden , den Dateityp angeben usw.
AKTUALISIEREN
Ich habe gerade The Silver Searcher entdeckt , das wie ack ist, aber 3-5x schneller als es und sogar Muster aus einer
.gitignore
Datei ignoriert .quelle
Sie können verwenden:
Das
r
steht für rekursiv und sucht daher im angegebenen Pfad und auch in seinen Unterverzeichnissen. Hier erfahren Sie den Dateinamen und können die Zeile in der Datei ausdrucken, in der die Zeichenfolge angezeigt wird.Oder ein Befehl ähnlich dem, den Sie versuchen (Beispiel :) zum Suchen in allen Javascript-Dateien (* .js):
Dadurch werden die Zeilen in den Dateien gedruckt, in denen der Text angezeigt wird, der Dateiname wird jedoch nicht gedruckt.
Zusätzlich zu diesem Befehl können wir auch Folgendes schreiben: grep -rn "Zu durchsuchender String" / path / to / directory / oder / file -r: rekursive Suche n: Zeilennummer wird für Übereinstimmungen angezeigt
quelle
Sie können dies verwenden:
quelle
Liste der Dateinamen, die einen bestimmten Text enthalten
Zunächst einmal, ich glaube , Sie verwendet haben ,
-H
statt-l
. Sie können auch versuchen, den Text in Anführungszeichen einzufügen, gefolgt von{} \
.Beispiel
Angenommen, Sie suchen in Ihrem Verzeichnis nach Dateien mit dem spezifischen Text "Apache License". Es werden ähnliche Ergebnisse wie unten angezeigt (die Ausgabe hängt vom Inhalt Ihres Verzeichnisses ab).
Entfernen Sie die Empfindlichkeit des Gehäuses
Auch wenn Sie den Fall nicht wie "Text" oder "TEXT" verwenden, können Sie den
-i
Schalter verwenden, um den Fall zu ignorieren. Weitere Details können Sie hier lesen .Hoffe das hilft dir.
quelle
find
Übergibt alle gefundenen Pfade an den Befehlgrep -l "text-to-find-here" <file found>"
. Sie können dem Dateinamen Einschränkungen hinzufügen, z. B.find / -iname "*.txt"
um nur in Dateien zu suchen, deren Name auf.txt
-iname
wird die Groß- und Kleinschreibung nicht berücksichtigt, was bedeutet, dass beispielsweise auch .TXT-Dateien sowie TxT und TXt usw. gefunden werden.grep
( GNU oder BSD )Mit dem
grep
Tool können Sie den aktuellen Ordner rekursiv durchsuchen, z.Hinweis:
-r
- Unterverzeichnisse rekursiv durchsuchen.Sie können auch die Globbing-Syntax verwenden, um in bestimmten Dateien zu suchen, z.
Hinweis: Mit der Globbing-Option (
**
) werden alle Dateien rekursiv mit einer bestimmten Erweiterung oder einem bestimmten Muster gescannt. Führen Sie Folgendes aus, um diese Syntax zu aktivieren :shopt -s globstar
. Sie können auch**/*.*
für alle Dateien (außer versteckte und ohne Erweiterung) oder andere Muster verwenden.Wenn Sie den Fehler haben, dass Ihr Argument zu lang ist, sollten Sie Ihre 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 unterstützt Ignoriermuster, die in
.gitignore
Dateien angegeben sind, sodass ein einzelner Dateipfad mit mehreren Glob-Mustern gleichzeitig abgeglichen werden kann.Sie können die allgemeinen Parameter verwenden, z.
-i
- Unempfindliche Suche.-I
- Ignorieren Sie die Binärdateien.-w
- Suche nach den ganzen Wörtern (im Gegensatz zur teilweisen Wortübereinstimmung).-n
- Zeigen Sie die Linie Ihres Spiels.-C
/--context
(zB-C5
) - Erhöht 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. Kann mit kombiniert werden-H
.quelle
Wenn Ihr
grep
nicht rekursive Suche nicht unterstützt, können Sie kombinierenfind
mitxargs
:Ich finde das leichter zu merken als das Format für
find -exec
.Dies gibt den Dateinamen und den Inhalt der übereinstimmenden Zeile aus, z
Optionale Flags, die Sie möglicherweise hinzufügen möchten
grep
:-i
- Suche ohne Berücksichtigung der Groß- und Kleinschreibung-l
- Geben Sie nur den Dateinamen aus, in dem die Übereinstimmung gefunden wurde-h
- nur die übereinstimmende Zeile ausgeben (nicht den Dateinamen)quelle
grep 'text-to-find-here'
ohne Dateinamen, wennfind
nichts gefunden wird. Dies wird hängen bleiben und auf Benutzereingaben warten! Fügen Sie--no-run-if-empty
als eine Optionxargs
.find … -exec grep … +
. Wenn Sie darauf bestehen, find zusammen mit xargs zu verwenden, verwenden Sie-print0
und-0
.i
: Ignorieren Sie die Unterscheidung zwischen Groß- und Kleinschreibung sowohl im MUSTER als auch in den Eingabedateien.n
: Stellen Sie jeder Ausgabezeile die 1-basierte Zeilennummer in der Eingabedatei voran.s
: Unterdrücken Sie Fehlermeldungen zu nicht vorhandenen oder nicht lesbaren Dateien.r
: Lesen Sie alle Dateien unter jedem Verzeichnis rekursiv.quelle
Es gibt ein neues Dienstprogramm namens The Silversearcher
Es arbeitet eng mit Git und anderen VCS zusammen. Sie erhalten also nichts in einem .git oder einem anderen Verzeichnis.
Sie können einfach verwenden
Und es wird die Aufgabe für Sie erledigen!
quelle
Wenn Sie find wie in Ihrem Beispiel verwenden, fügen Sie besser
-s
(--no-messages
) zugrep
und2>/dev/null
am Ende des Befehls hinzu, um zu vermeiden, dass viele Nachrichten mit und ohne Berechtigung von :grep
find
find ist das Standardwerkzeug für die Suche nach Dateien - kombiniert mit grep bei der Suche nach bestimmten Texten - auf Unix-ähnlichen Plattformen. DerBefehl find wirdübrigensoft mit xargs kombiniert.
Für denselben Zweck gibt es schnellere und einfachere Tools - siehe unten. Probieren Sie sie besser aus, vorausgesetzt, sie sind auf Ihrer Plattform verfügbar :
Schnellere und einfachere Alternativen
RipGrep - schnellstes Suchwerkzeug:
Der Silbersucher :
ack :
Hinweis: Sie können
2>/dev/null
diesen Befehlen auch hinzufügen , um viele Fehlermeldungen auszublenden.Warnung : Wenn Sie dies nicht wirklich vermeiden können, suchen Sie nicht in '/' (dem Stammverzeichnis) , um eine lange und ineffiziente Suche zu vermeiden! In den obigen Beispielen sollten Sie ' / ' durch einen Unterverzeichnisnamen ersetzen , z. B. "/ home", je nachdem, wo Sie tatsächlich suchen möchten ...
quelle
grep
find
durchsucht das Innere von Dateien nicht direkt nach Text. Und vielleicht sind diese zusätzlichen Tools für einige nützlich, aber Oldtimer und diejenigen, die es gewohnt sind, z. B.grep
würden ihnen überhaupt keine Zeit geben ( naja, das werde ich bestimmt nicht). Das heißt aber nicht, dass sie nutzlos sind.fol
? Nein natürlich nicht; es wurde genanntdir
(und ich glaube es ist immer noch). Ordner ist eine Sache, die für (ich denke) Benutzerfreundlichkeit erfunden wurde, obwohl es in diesem Fall vielleicht für weniger "fortgeschrittene" Benutzer dumm ist?Versuchen:
quelle
xargs
.echo "file bar.txt has bar" > bar.txt; echo "file foo bar.txt has foo bar" > "foo bar.txt"; echo "You should never see this foo" > foo; find . -name "*.txt" | xargs grep -i foo # ./foo:You should never see this foo
. Dasxargs
hier stimmte mit der FALSCHEN Datei überein und stimmte NICHT mit der beabsichtigten Datei überein. Verwenden Sie entweder eine,find .. -print0 | xargs -0 ...
aber das ist eine nutzlose Verwendung einer Pfeife oder besserfind ... -exec grep ... {} +
Verwenden
pwd
Sie diese Option, um aus einem beliebigen Verzeichnis, in dem Sie sich befinden, nach unten zu suchenUpdate Abhängig von der verwendeten Grep-Version können Sie diese weglassen
pwd
. Bei neueren Versionen.
scheint dies der Standardfall für grep zu sein, wenn kein Verzeichnis angegeben wird:grep -rnw -e "pattern"
oder
grep -rnw "pattern"
wird das gleiche tun wie oben!
quelle
pwd
ist überhaupt nicht erforderlich, da dies die Standardeinstellung ist.grep -rnw "pattern"
genügt.grep -rnw
und das, was vor drei Jahren beantwortet wurde, ich sehe nicht, wie diese Antwort Mehrwert schafft.grep -rnw '/path/to/somewhere/' -e "pattern"
, was Sie hier haben. 5 Stimmen nach 2,3 Millionen Besuchen bedeuten nicht so viel.grep
kann verwendet werden, auch wenn wir nicht nach einer Zeichenfolge suchen.Einfach laufen,
druckt den Pfad zu allen Textdateien aus, dh zu solchen, die nur druckbare Zeichen enthalten.
quelle
ls
oderfind
(für die rekursive)Hier finden Sie eine Liste von Befehlen, mit denen Dateien durchsucht werden können.
quelle
egrep
ist gleichbedeutend mitgrep -E
und es bedeutet, dass--extended-regexp
Sie Details hier finden können unix.stackexchange.com/a/17951/196072Silver Searcher ist ein großartiges Tool, aber Ripgrep kann noch besser sein.
Es funktioniert unter Linux, Mac und Windows und wurde vor einigen Monaten in den Hacker News geschrieben (dies hat einen Link zu Andrew Gallants Blog, der einen GitHub-Link hat):
Ripgrep - Ein neues Befehlszeilensuchwerkzeug
quelle
Erklärung aus Kommentaren
find ist ein Befehl, mit dem Sie Dateien und andere Objekte wie Verzeichnisse und Links in Unterverzeichnissen eines bestimmten Pfads finden können. Wenn Sie keine Maske angeben, die Dateinamen erfüllen sollen, werden alle Verzeichnisobjekte aufgelistet.
quelle
Versuchen:
Das wird alle Dateisysteme durchsuchen, da
/
es sich um den Stammordner handelt.Für den Home-Ordner verwenden Sie:
Für den aktuellen Ordner verwenden Sie:
quelle
Hoffe das ist hilfreich ...
Wenn Sie das
grep
Bit etwas erweitern, um weitere Informationen in der Ausgabe zu erhalten, um beispielsweise die Zeilennummer in der Datei zu erhalten, in der sich der Text befindet, können Sie wie folgt vorgehen:Wenn Sie eine Vorstellung vom Dateityp haben, können Sie Ihre Suche eingrenzen, indem Sie Dateityperweiterungen angeben, nach denen gesucht werden soll, in diesem Fall
.pas
ODER.dfm
Dateien:Kurze Erläuterung der Optionen:
.
in demfind
gibt aus dem aktuellen Verzeichnis an.-name
"*.*
": für alle Dateien (-name "*.pas
" -o -name "*.dfm
"): Nur die*.pas
ODER-*.dfm
Dateien, ODER angegeben mit-o
-type f
Gibt an, dass Sie nach Dateien suchen-print0
und--null
auf der anderen Seite der|
(Pipe) sind die entscheidenden, die den Dateinamen von demfind
zumgrep
eingebetteten in übergebenxargs
, wodurch Dateinamen MIT Leerzeichen in den Dateinamen übergeben werden können, sodass grep den Pfad und den Dateinamen als eine Zeichenfolge behandeln kann. und nicht in jedem Raum aufbrechen.quelle
-name '*.*'
ist nicht was du sagst; Eine Datei mit dem Namen "Datei" wird nicht erfasst, da das Muster nicht dem entspricht (keine .ext).*
würde aber (naja. Dateien beiseite). Aber es gibt noch eine andere Sache: Wenn Sie alle Dateien möchten, warum sollten Sie sich überhaupt die Mühe machen, einen Dateinamen anzugeben? Kein anderer Kommentar - außer dass es schön ist zu wissen, dass es immer noch Leute gibt, die den MS-Terminologie-Ordner nicht verwenden (was ich, nachdem ich es genug gesagt habe, nicht hinzufügen würde, aber ich wollte auf die etwas falsche Aussage hinweisen, die Sie gemacht haben mit Dateinamen - sowie die Redundanz / Nutzlosigkeit bei 'all').Ein Simple
find
kann praktisch funktionieren. Alias es in Ihrer~/.bashrc
Datei:Starten Sie ein neues Terminal und geben Sie Folgendes ein:
quelle
Ich habe ein Python-Skript geschrieben, das etwas Ähnliches tut. So sollte man dieses Skript verwenden.
Das erste Argument
path
ist das Verzeichnis, in dem wir rekursiv suchen werden. Das zweite Argumentpattern_to_search
ist ein regulärer Ausdruck, den wir in einer Datei suchen möchten. Wir verwenden das in der Python-re
Bibliothek definierte Format für reguläre Ausdrücke . In diesem Skript entspricht das.
auch der Zeilenumbruch.Das dritte Argument
file_pattern
ist optional. Dies ist ein weiterer regulärer Ausdruck, der mit einem Dateinamen arbeitet. Es werden nur die Dateien berücksichtigt, die diesem regulären Ausdruck entsprechen.Zum Beispiel, wenn ich Python-Dateien mit der Erweiterung durchsuchen möchte
py
enthaltenPool(
Wort gefolgtAdaptor
, habe ich die folgenden,Und voila, es generiert den Pfad der übereinstimmenden Dateien und die Zeilennummer, unter der die Übereinstimmung gefunden wurde. Wenn mehr als eine Übereinstimmung gefunden wurde, wird jede Zeilennummer an den Dateinamen angehängt.
quelle
Wenn Sie ausschließlich verwenden möchten,
find
verwenden Siefind + grep
:find /path/to/somewhere/ -type f -exec grep -nw 'textPattern' {} \;
Schritte:
1. Verwenden Sie
find
zum Durchsuchen von Dateien.2. Führen Sie dann aus
grep
alle aus.Dies kann Ihnen die Möglichkeit geben
find
, Dateien zu finden.Verwenden
-name Pattern
Sie diese Option, wenn Siegrep
nur bestimmte Dateien verwenden möchten :find /path/to/somewhere/ -type f -name \*.cpp -exec grep -nw 'textPattern' {} \;
Sie können damit spielen und verschiedene Optionen verwenden
find
, um Ihre Dateisuche zu verbessern oder einzugrenzen.quelle
Verwenden:
Dadurch wird gemeldet, wie viele Kopien Ihres Musters in jeder der Dateien im aktuellen Verzeichnis vorhanden sind.
quelle
grep ist dein guter Freund, um dies zu erreichen.
Wenn Sie sich nicht für den Fall des zu findenden Textes interessieren, verwenden Sie:
quelle
-
s enthält, möchten Sie sie--
zuerst an grep übergeben. das kann sonst interessante Nebenwirkungen verursachen!Ich bin fasziniert, wie einfach grep es mit 'rl' macht:
Es funktioniert einfach perfekt ...
quelle
.txt
). Oder gibt es eine Möglichkeit, das zu tun?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
find … -exec grep 'str' {} \;
(wenn Sie überhaupt verwenden müssenfind
).find
enthaltenen Leerzeichen gefunden würde. Sie könntengrepping
die falschen Dateien erhalten und / oder die richtigen Dateien insgesamt vermissen. Verwendenfind ... -exec grep ...
Sie es einfach, wenn Sie es benötigenfind
. In diesem Fallgrep -r ...
reicht jedoch ein.Es gibt ein
ack
Tool, das genau das tut, wonach Sie suchen.http://linux.die.net/man/1/ack
Sie können die
-i
Suche bei Groß- und Kleinschreibung ignorierenquelle
Alle vorherigen Antworten schlagen grep and find vor. Aber es gibt noch einen anderen Weg: Verwenden Midnight Commander
Es ist ein kostenloses Dienstprogramm (30 Jahre alt, durch die Zeit bewiesen), das visuell ist, ohne GUI zu sein. Es hat unzählige Funktionen, und das Finden von Dateien ist nur eine davon.
quelle
Der folgende Befehl funktioniert für diesen Ansatz einwandfrei:
quelle
find
und danngrep -r
? Sie sind für dasselbe gedacht, daher ist dies überflüssig.find
.Vermeiden Sie den Ärger und installieren Sie ack-grep. Es beseitigt viele Probleme mit Berechtigungen und Angeboten.
Gehen Sie dann zu dem Verzeichnis, das Sie suchen möchten, und führen Sie den folgenden Befehl aus
quelle