Wie verwende ich grep für alle Dateien in einem Verzeichnis, das nicht rekursiv ist?

10

Ich möchte in allen Dateien in einem Verzeichnis nach einer Zeichenfolge suchen (und nicht in dessen Unterverzeichnissen; ich weiß, dass die Option -r dies tut, aber das ist nicht das, was ich will).

  1. Laufen

    grep "string" /path/to/dir
    

    soll das können, habe ich gelesen, aber ich bekomme den Fehler:

    grep: dir: ist ein Verzeichnis

  2. Als Nächstes habe ich versucht, grep für mehrere Dateien auszuführen.

    grep "string" .bashrc .bash_aliases funktioniert einwandfrei.

    grep "string" .bash* funktioniert auch wie beabsichtigt.

    grep "string" * gibt mir die Fehler:

    grep: data: Is a directory
    grep: Desktop: Is a directory
    grep: Documents: Is a directory
    grep: Downloads: Is a directory
    ...
    

Nur die Fehler werden gedruckt, ich bekomme keine passenden Zeilen. Ich habe versucht, die Option -s zu verwenden, jedoch ohne Erfolg.

Also meine Fragen:

  1. Warum kann ich grep nicht für ein Verzeichnis verwenden, wie in (1), wenn ich kann? Ich habe das in zahlreichen Beispielen im Internet gesehen. Bearbeiten : Wenn ich sage "grep für ein Verzeichnis verwenden", meine ich "alle Dateien in diesem Verzeichnis mit Ausnahme seiner Unterverzeichnisse durchsuchen ". Ich glaube, dass dies grep tut, wenn Sie ihm anstelle einer Datei ein Verzeichnis übergeben. Bin ich falsch

  2. Bitte erläutern Sie die Funktionsweise von grep , die das Verhalten von Befehlen in (2) erklären würde.
    Bearbeiten : Lassen Sie mich genauer sein. Warum verwenden Sie Platzhalter, um mehrere Dateien anzugeben, für die mit .bash* gearbeitet werden soll, und nicht mit * oder sogar ./* ?

  3. Wie kann ich mit grep alle Dateien in einem Verzeichnis (und nicht in dessen Unterverzeichnissen) durchsuchen?

John Red 25.05.2016, 18:07

4 Antworten

20

In Bash wird ein Glob nicht in ausgeblendete Dateien erweitert. Wenn Sie also alle Dateien in einem Verzeichnis durchsuchen möchten, müssen Sie die versteckten Dateien .* und nicht versteckte% co_de angeben %.

Um die Fehler "Ist ein Verzeichnis" zu vermeiden, können Sie * verwenden. Auf meinem System wird jedoch auch ein Fehler -d skip angezeigt. Daher wird die Verwendung von grep: .gvfs: Permission denied empfohlen, wodurch alle Fehlernachrichten ausgeblendet werden.

Der Befehl, den Sie suchen, lautet also:

grep -s "string" * .*

Wenn Sie Dateien in einem anderen Verzeichnis durchsuchen:

grep -s "string" /path/to/dir/{*,.*}

Eine andere Option ist die Verwendung der -s -Schalenoption, wodurch ein Glob versteckte Dateien enthält.

shopt -s dotglob
grep -s "string" *

Für Dateien in einem anderen Verzeichnis:

grep -s "string" /path/to/dir/*
    
wjandrea 25.05.2016, 20:53
8

Sie müssen die Option -d skip hinzufügen.

  1. Grep sucht innerhalb von Dateien. Sie können, wie Sie gesagt haben, rekursiv suchen, wenn Sie Dateien innerhalb eines Verzeichnisses suchen möchten.

  2. Standardmäßig liest grep alle Dateien und erkennt die Verzeichnisse. Da Sie standardmäßig nicht festgelegt haben, was mit den Verzeichnissen mit der Option -d zu tun ist, wird eine Fehlerausgabe ausgegeben.

  3. Nur innerhalb des übergeordneten Verzeichnisses suchen würde 'grep -d überspringen "string" ./*

anonymous2 25.05.2016 18:13
6

Alte Timer würden wahrscheinlich folgendes tun:

find . -type f -print0 | xargs -0 grep "string"
    
dathompson 26.05.2016 02:25
1

Umformulierung - Sie möchten die Dateien in einer Ebene des Unterverzeichnisses speichern, aber nicht in allen Unterverzeichnissen rekursieren?

grep forthis  *  */*

Oder wenn Sie die Dateien nicht im aktuellen Verzeichnis haben möchten

grep forthis  */*

Beachten Sie, dass Verzeichnisse nicht mit einem Punkt beginnen.

grep forthis  .*/*    */*   

sollte diese Aufgabe erledigen.

Es gibt auch die Einschränkungsparameter -maxdepth und -mindepth , die auch für den Befehl find verfügbar sind.

    
Criggie 26.05.2016 03:42

Tags und Links