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 mitgrep -r foo *
sehen, dass der Shell Glob*
nicht ' wird nicht um versteckte Verzeichnisse / Dateien erweitert, es sei denn,dotglob
wurde mitshopt -s dotglob
festgelegt. Versuchen Sie es mitgrep -r foo .
und Sie ' Die versteckten Verzeichnisse werden von grep durchlaufen. Oder versuchen Sie es mitshopt -s dotglob
und danngrep -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
- Zitieren Sie Ihre Befehlsersetzung:
"$(pwd)"
Siehe auch Warum verschluckt sich mein Shell-Skript an Leerzeichen oder anderen Sonderzeichen?
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" {} \+