/ / CMD - Auflisten von Textdateien, die einige Wörter enthalten - Windows, cmd.exe, Suche

CMD - Wie man Textdateien auflistet, die einige Wörter enthalten - Windows, cmd.exe, Suche

Wenn in Windows ein Ordner mit mehreren Dateien vorhanden ist, sagen Sie c: / Ordner mit Dateien und darin befinden sich zufällige Namensdateien.

Und ich habe eine .txt-Datei mit mehreren Wörtern, sagen Sie c: /words/wordstofind.txt

Ich w√ľrde gerne wissen, ob es einen Weg gibt, den PCkann √ľberpr√ľfen, ob eines der W√∂rter in wordstofind.txt in jeder der Dateien in c: / Ordner mit Dateien vorhanden ist. Wenn mindestens 1 vorhanden ist, gebe ich die Dateinamen der Dateien in diesem Ordner an, die eines der W√∂rter enthalten W√∂rter in wordstofind.txt

Ich muss nicht wissen, welches Wort es gefunden hat und auchWenn es ein Wort findet, kann es den Dateinamen dieser Datei hinzuf√ľgen, um das Ergebnis direkt zu erhalten, und die Suche nach der n√§chsten Datei im Ordner fortsetzen (1 Ergebnis reicht aus, um zur Ergebnisdatei zu gelangen).

Ergebnisdatei, die in C: /results/resultfilenames.txt gespeichert werden soll

Wenn ich die Datei resultfilenames.txt √∂ffne, sollte sie nur den Namen der Dateien enthalten, die eines der angegebenen W√∂rter enthalten, m√∂glichst nicht den Ordner (was f√ľr alle gleich w√§re).

Vielen Dank

Antworten:

0 f√ľr Antwort ‚ĄĖ 1

F√ľr eine native Windows-L√∂sung FINDSTR ist eine m√∂gliche Option. F√ľr Ihren Anwendungsfall k√∂nnten Sie versuchen:

findstr /l /s /i /m /g:searchwords.txt /f:filestosearch.txt > results.txt

Dies weist FINDSTR an:

  • Verwenden Sie die Suchw√∂rter als Zeichenfolgenliterale (und nicht als regul√§re Ausdr√ľcke).

  • Unterordner wiederverwenden.

  • Gro√ü- / Kleinschreibung ignorieren.

  • Drucken Sie nur Dateinamen (die den vollst√§ndigen Verzeichnispfad enthalten).

Beachten Sie jedoch, dass FINDSTR hat undokumentierte Grenzen und Fehler was es möglicherweise nicht zu einer geeigneten Option macht.

F√ľr eine nicht native L√∂sung ist m√∂glicherweise ein Port von von interessiert grep Dienstprogramm, wie z GNUWin32 grep. W√§hrend grep-Implementierungen in den von ihnen unterst√ľtzten Optionen variieren k√∂nnen, ist GNUWin32 grep ein Port von GNU grep (wenn auch aktuell v2.5.4 statt v3.0), die Suchbegriffe aus einer Datei lesen k√∂nnen. F√ľr Ihren Anwendungsfall k√∂nnen Sie versuchen:

grep -rilf C:pathtosearchwords.txt C:pathtosearch > results.txt

Dies sagt grep zu (bzw.):

  • Unterordner wiederverwenden.

  • Gro√ü- / Kleinschreibung ignorieren.

  • Unterdr√ľckt die normale Ausgabe (nur Dateien auflisten, einschlie√ülich des vollst√§ndigen Pfads).

  • Suchbegriffe aus einer Textdatei ziehen.

Sowohl FINDSTR als auch grep geben vollst√§ndige Pfade zu a zur√ľckDatei, so dass Sie wahrscheinlich zus√§tzliche Verarbeitung auf die Ausgabe von einer der beiden tun m√ľssen. Beachten Sie jedoch, dass bei grep-Optionen im Gegensatz zu FINDSTR in der Regel die Gro√ü- und Kleinschreibung beachtet wird. Zum Beispiel ist -L nicht die gleiche Option wie -l (Kleinbuchstabe L). Alle Pfade mit Leerzeichen erfordern wie gewohnt doppelte Anf√ľhrungszeichen ("").

Wenn Sie nur bestimmte Dateien durchsuchen möchten, können Sie diese einzeln in der Befehlszeile auflisten (z. doc1.txt doc2.txt doc3.txt) anstelle des Verzeichnisses. Sie können vollständige Pfade verwenden (z.C:pathtodoc1.txt) wie nötig.

Es ist auch erw√§hnenswert, dass der Grund, warum ich die "searchwords.txt" -Datei in einem separaten Verzeichnis abgelegt habe, darin besteht, dass GNUWin32 grep diese Datei ansonsten in die "√ľbereinstimmenden" Elemente einbezieht.

W√§hrend es in den meisten F√§llen kein Deal-Breaker sein sollte, verwendet GNUWin32 grep f√ľr seine Ausgabe Zeilenvorsch√ľbe im Unix-Stil sowie eine Mischung aus und / nach Wegen.

Beachten Sie, dass es am Ende dieser Antwort einige zusätzliche Erklärungen zu diesen letzten beiden GNUWin32-spezifischen Macken gibt. Vielleicht möchten Sie das auch lesen. =)

Ausgabe fixieren Mit sed

Da Sie nur die Dateinamen ben√∂tigen, k√∂nnen wir auch ein anderes GNUWin32-Dienstprogramm mit dem Namen verwenden sed diese zu erhalten. Dies ist ein Hafen von GNU sed, ein "nicht interaktiver Befehlszeilen-Texteditor". Dies bedeutet, dass dieses Programm Texteingaben √ľber die Befehlszeile entgegennehmen, auf standardisierte Weise √§ndern und diese ge√§nderten Daten ausgeben kann.

In unserem Fall mit GNUWin32 grep können wir damit vor jedem Dateinamen alles löschen:

sed s/.+[/+]//

Außerdem können wir pfeifen | Die Ausgabe von grep nach sed sieht so aus:

grep -rilf C:pathtosearchwords.txt C:pathtosearch | sed s/.+[/+]// > results.txt

Dies bel√§sst nur den Dateinamen in "results.txt" und hat den zus√§tzlichen Vorteil, dass Probleme mit beseitigt werden / und Zeilenvorsch√ľbe im Unix - Stil (alle / entfernt werden und sed zumindest bei einer solchen Verrohrung normale Windows-Zeilenumbr√ľche ausgibt).

Der sed-Befehl setzt sich wie folgt zusammen:

  • s/ ist der Anfang des Ersatzbefehls.
  • .+[/+] ist ein regul√§rer Ausdruck (was wir finden wollen - in diesem Fall alles bis einschlie√ülich der letzten / in unserer grep Ausgabe).
  • // ist jeweils die erforderliche / Trennzeichen zwischen unserem zu findenden Artikel und unserem Ersatz, kein Leerzeichen (ein Leerzeichen als Ersatz) und dem endg√ľltigen / Erforderlich f√ľr alle sed-Ersatzbefehle.
  • sed k√∂nnen wir auch andere Abscheider z. + bei Konflikten (zB mit Verzeichnisschr√§gstrichen).
  • Ein fehlendes Finale / wird zu einem "nicht abgeschlossenen" "Befehl" -Fehler f√ľhren.

Als kleine Einschr√§nkung werden mit dem obigen sed-Befehl auch Informationen zu Unterverzeichnissen entfernt, sodass sich die zur√ľckgegebenen Dateinamen m√∂glicherweise nicht alle im selben (Root-) Verzeichnis befinden.

Sie k√∂nnen mehr √ľber regul√§re Ausdr√ľcke von GNU sed lesen Hier.


GNUWin32 grep Quirks

Newlines

Newlines sind normalerweise versteckte Steuerzeichen in einem Textdokument, die einer Anwendung signalisieren, wo Textzeilen zu trennen sind. Wichtig ist, dass diese von Betriebssystem zu Betriebssystem unterschiedlich sein können.

Im Falle des Unix-Style Bei Systemen (von denen grep stammt) handelt es sich um einen einfachen Zeilenvorschub, dargestellt als /n z.B.

line 1 /n
line 2 /n

Windows ist √§hnlich, verwendet jedoch einen zus√§tzlichen Wagenr√ľcklauf (dargestellt als) /r, vor seinem Zeilenvorschub. Dies f√ľhrt zu einem kombinierten /r/n anstatt nur /n.

Obwohl dies normalerweise kein Problem ist, verhalten sich einige Windows-Programme (z. B. Windows Notepad) bei einzelnen Zeilenumbr√ľchen anders (/n). Ein h√§ufiges Problem besteht darin, Linien zusammen laufen zu lassen, z.

line1line2

Da GNUWin32 grep produziert /n Steuerzeichen nur und nicht /r/nkann dies dazu f√ľhren, dass die an eine Datei gesendete Ausgabe (√ľber ">" oben) in einigen F√§llen Lesbarkeit oder andere Probleme aufweist. Falls erforderlich, kann dies durch Ersetzen der behoben werden /n Steuerzeichen mit /r/n (durch zus√§tzliches Scripting m√∂glich) oder einfach durch Verwendung eines Programms, das das Lesen / Ersetzen dieser Zeichen unterst√ľtzt (z. B. Notepad ++).

Umgekehrte Trennzeichen

Eine weitere ererbte Besonderheit ist der Unterschied in den Trennzeichen, die f√ľr Verzeichnisse (Pfade) zwischen Unix-artigen und Windows-Systemen verwendet werden. Bei Systemen im Unix-Stil sind die Trennzeichen Schr√§gstriche, z.

/path/to/some/file.txt

Windows verwendet jedoch umgekehrte Schrägstriche, z.

C:pathtosomedirectory

GNUWin32 grep kombiniert die beiden seltsamerweise unter Verwendung der normalen umgekehrten Schr√§gstriche f√ľr den prim√§ren Verzeichnispfad und der Schr√§gstriche f√ľr die Auflistung der Dateianpassungsergebnisse, z.

C:pathtosomedirectory/match1.txt
C:pathtosomedirectory/subdirectory/match2.txt

Diese Eigenart kann durch (erneutes) zus√§tzliches Scripting oder einfaches Suchen / Ersetzen in einem normalen Texteditor √ľberwunden werden.