Nach dem Rat unter dieser Frage kann ich rekursiv nach einer Zeichenfolge suchen string innerhalb des Inhalts eines bestimmten Verzeichnisses dir wie folgt

grep -r --exclude-dir=".*" string dir 

Wenn ich dies jedoch auf das aktuelle Verzeichnis als

$ grep -r --exclude-dir=".*" string . $ 

anwende, erhalte ich keine Ergebnisse, da die --exclude-dir=".*" wird das aktuelle Verzeichnis nicht ausgeblendet, da es mit ".*" übereinstimmt.

Eine Problemumgehung besteht darin, über , führen Sie dann den Befehl für das entsprechende untergeordnete Element aus und cd kehren Sie erneut in das ursprüngliche Arbeitsverzeichnis zurück. Es muss einen einzelnen Befehl geben, mit dem ich dies tun kann, ohne die Verzeichnisse ändern zu müssen.

Was ist ein einzelner Befehl zum Grep von Inhalten? Auslassen des Inhalts versteckter Verzeichnisse im aktuellen Verzeichnis?

Antwort

Wenn Sie GNU grep 2.11 oder höher verwenden, startet -r aus dem aktuellen Verzeichnis, wenn kein Verzeichnis angegeben ist:

grep -r --exclude-dir=".*" string 

Kommentare

  • Gut zum Einfügen des Versionshinweises. Mit BSD grep wird Folgendes erzeugt: grep: warning: recursive search of stdin

Antwort

In Shell Glob (auch als Dateinamenmuster bezeichnet) hat . keine besondere Bedeutung, * bedeutet null oder mehr Zeichen und ? bedeutet ein einzelnes Zeichen.

Was Sie ausschließen möchten, ist ein Punkt, gefolgt von mindestens einem Zeichen und dann eine beliebige Anzahl von Zeichen. Verwenden Sie also:

grep -r --exclude-dir=".?*" string . 

Antwort

Seit bash hat grep standardmäßig keine versteckten Verzeichnisse durchlaufen (dh ohne dotglob aktiviert:

$ tree -a . ├── .test │ ├── .file │ └── file ├── file └── test ├── .file └── file 2 directories, 5 files $ grep -r foo * file:foo test/.file:foo test/file:foo 

Schließen Sie einfach versteckte Dateien aus:

$ grep --exclude=".*" -r foo * file:foo test/file:foo 

Kommentare

    ch bin neugierig auf die Gründe für die unkommentierte Ablehnung.
  • Ich habe ' nicht abgelehnt, aber ' ist nicht wahr, dass grep ' keine versteckten Verzeichnisse durchläuft. Was Sie ' Wenn Sie mit grep -r foo * sehen, dass der Shell Glob * nicht ' wird nicht um versteckte Verzeichnisse / Dateien erweitert, es sei denn, dotglob wurde mit shopt -s dotglob festgelegt. Versuchen Sie es mit grep -r foo . und Sie ' Die versteckten Verzeichnisse werden von grep durchlaufen. Oder versuchen Sie es mit shopt -s dotglob und dann grep -r foo *.
  • Fair point; Ich habe dies in meiner Antwort klargestellt.
  • Dadurch werden weiterhin Dateien in versteckten Verzeichnissen durchsucht, die in den Befehlszeilenargumenten enthalten sind. Es wird irgendwie funktionieren. In den meisten Fällen mag es in Ordnung sein, aber ' ist wie das Definieren von " pi " als " 3.1416 "; Sie kennen die Einschränkungen besser.

Antwort

Sie können das aktuelle Verzeichnis auch mit wie:

grep -r --exclude-dir=".*" string "$(pwd)" 

Kommentare

Antwort

Um innerhalb einer single (ohne versteckte Dateien für Unterverzeichnisse einzuschränken) verwendet:

Da echo dir/* alle Dateien im Verzeichnis druckt, funktioniert dies für Dateien in einem Verzeichnis:

$ grep -r "string" $(echo dir/*) 

Ändern Sie einfach dir in . (Punkt) und Sie erhalten genau das, was Sie möchten:

$ grep -r "string" $(echo ./*) 

Wenn keine versteckten Dateien in einem der Unterverzeichnisse benötigt werden, verwenden Sie entweder:

$ grep -r --exclude-dir=".*" "string" 

Oder verwenden Sie find:

find . -not -path "*/\.*" -type f -exec grep "string" {} \+ 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.