Suchen Sie ein bestimmtes Wort in allen Dateien im und unter dem aktuellen Verzeichnis

7

Ich möchte alle Dateien finden und den Pfad und den Dateinamen für jede Datei drucken, in der der Text "Numlock" verwendet wird - ob in Klein-, Groß- oder Großbuchstaben.

Welchen Befehl soll ich verwenden?

ksor
quelle
Ich denke, Sie haben eine Datei bearbeitet und ihren Pfad vergessen. Hab ich recht?
Avinash Raj
Dieser tail -10 ~/.bash_historyBefehl zeigt Ihnen die letzten 10 Befehle, die Sie auf dem Terminal ausgeführt haben. Daraus können Sie den einen identifizieren.
Avinash Raj
Nein, ich versuche, mein NumLock im Logog-Dialogfeld einzuschalten, und möchte ALLE Dateien finden, in denen NumLock erwähnt wird - nur um zu sehen, was los ist.
ksor
du meinst das Wort numlock in den Dateinamen.
Avinash Raj
Nein, im Inhalt der Dateien
ksor

Antworten:

3

Das folgende Skript durchsucht (Text-) Dateien in einem bestimmten Verzeichnis rekursiv nach Vorkommen einer bestimmten Zeichenfolge, unabhängig davon, ob diese in Groß- oder Kleinbuchstaben oder in einer Kombination davon vorliegt.

Sie erhalten eine Liste der gefundenen Übereinstimmungen, die Pfade zu den Dateien, kombiniert mit dem Dateinamen und den tatsächlichen Vorkommen der Zeichenfolge in der Datei.

/path/to/file1 ['numlock', 'numlocK']
/longer/path/to/file2 ['NuMlOck']

usw.

Um die Suchzeit zu begrenzen, würde ich in bestimmten Verzeichnissen nach Übereinstimmungen suchen, also nicht nach 2 TB Dateien;).

Um es zu benutzen:

1] Kopieren Sie den folgenden Text und fügen Sie ihn in eine leere Textdatei (gedit) ein. 2] Bearbeiten Sie die beiden Zeilen im Kopfabschnitt, um die zu suchende Zeichenfolge und das zu durchsuchende Verzeichnis zu definieren. 3] Speichern Sie es als searchfor.py. 4] So führen Sie es aus: Öffnen Sie ein Terminal, geben Sie python3+ ein space, ziehen Sie das Skript in das Terminalfenster und drücken Sie die Eingabetaste. Die Liste der gefundenen Übereinstimmungen wird im Terminalfenster angezeigt

Im Fehlerfall wird dies vom Skript erwähnt.

#!/usr/bin/python3
import os
#-----------------------------------------------------
# give the searched word here in lowercase(!):
searchfor = "string_to_look_for"
# give the aimed directory here:
searchdir = "/path/to/search"
#-----------------------------------------------------
wordsize = len(searchfor)
unreadable = []
print("\nFound matches:")
for root, dirs, files in os.walk(searchdir, topdown=True):
    for name in files:
        file_subject = root+"/"+name
        try:
            with open(file_subject) as check_file:
                words = check_file.read()
                words_lower = words.lower()
                found_matches_list = [i for i in range(len(words_lower)) if words_lower.startswith(searchfor, i)]
                found_matches = [words[index:index+wordsize] for index in found_matches_list]
                if len(found_matches) != 0:
                    print(file_subject, found_matches)
                else:
                    pass
        except Exception:
            unreadable.append(file_subject)
if len(unreadable) != 0:
    print("\ncould not read the following files:")
    for item in unreadable:
        print("unreadable:", item)
Jacob Vlijm
quelle
Ich habe eine Datei auf dem Desktop mit der Zeile "#! / Usr / bin / python3" und allen zum (einschließlich) "pass" erstellt - dann öffne ich ein Terminal Strg + Alt + t und tippe puthon3 und 1 Leerzeichen, dann ziehe das Dateisymbol vom Desktop zum Terminalfenster ... und es "läuft" einfach wieder zurück zum Desktop ... nichts passiert. Ich glaube nicht, dass das Skript in python3 "geleitet" wird - richtig?
ksor
An dem Dateinamen und dem Inhalt der Datei ist nichts auszusetzen. Wenn ich jedoch das Dateisymbol per Drag & Drop vom Desktop in das geöffnete Terminalfenster ziehe, in das "python3" geschrieben ist, wird das Symbol beim Ablegen einfach wieder auf dem Desktop "ausgeführt" es - genau das gleiche mit Ihrer Datei auch
ksor
JA, es hat funktioniert!
ksor
@ksor AHA! Das ist nett. die alte Version oder die neue?
Jacob Vlijm
3
Mir ist nicht klar, warum dies rekursivem grep vorzuziehen ist.
Belacqua
14

Sie können grep -reine rekursive Suche nach Dateiinhalten durchführen, z

grep -Iri 'numlock' /path/to/search/dir/

Wo /path/to/search/dir/befindet sich das Verzeichnis der obersten Ebene, von dem aus Sie die Suche starten möchten? Sie können es verwenden, sind /jedoch darauf vorbereitet, dass es lange dauert.

Einige Variationen, abhängig von Ihrer genauen Anforderung:

  • Ändern Sie die -rOption in, -Rwenn Sie symbolischen Links folgen möchten
  • Fügen Sie die -lOption hinzu, nur die Namen der gefundenen Dateien zu drucken

Das Iweist grep an, Binärdateien zu ignorieren, und imacht die Suche unabhängig von Groß- und Kleinschreibung.


Wenn Ihre Version von grep keine rekursive Suche unterstützt, können Sie dasselbe mit einer Kombination aus find und grep erreichen, z

find /path/to/search/dir/ -type f -exec grep --color -HIi 'numlock' {} +
Steeldriver
quelle