Suchen | grep funktioniert in Cygwin nicht

Suchen | grep funktioniert in Cygwin nicht

Ich habe Cygwin installiert und wenn ich mit diesem Befehl nach dem Quellcode suche, wird nichts angezeigt, obwohl ich diese Zeichenfolge in einer Datei habe

$ echo foo > bar
$ find . -name '*' | grep foo

Es wird nichts angezeigt. Dieser Befehl funktioniert unter GNU+Linux einwandfrei.

$ grep foo bar

Antwort1

Wie erwähnt gibt find eine Liste der gefundenen Dateien an stdout aus. grep erwartet normalerweise, stdout zu durchsuchen, wenn es auf diese Weise aufgerufen wird.

Sie könnten find auch an weiterleiten xargsund es wird "Erstellen und Ausführen von Befehlszeilen über die Standardeingabe", wie in

$ find . | xargs grep foo

Wenn Sie verrückte Dateinamen mit Zeilenumbrüchen und so weiter haben, wäre dies besser:

$ find . -type f -print0 | xargs -0 grep foo

und es werden nur normale Dateien gefunden, also keine Versuche, irgendwelche Verzeichnisse oder „lustige“ Dateien -type fzu durchsuchen ....

Antwort2

find . -name  '*' # This will produce a list of *file names*

Sie übergeben dann Ihre Liste der Dateinamen an grepstdin, es behandelt die Liste als Text und sucht nachfoo

Sie haben keinen Dateinamen, foodaher wird nichts zurückgegeben.

Um rekursiv nach Text in einer Datei zu suchen, können Sie einfach verwenden

grep -R foo somefolder/

Antwort3

Wenn ich mit diesem Befehl nach dem Quellcode suche, wird nichts angezeigt

$ echo foo > bar
$ find . -name '*' | grep foo

findsucht nach Dateinamen, die ein gewünschtes Kriterium erfüllen: Name, Größe, Dateityp und gibt eine Liste mit übereinstimmenden Dateinamen zurück. Es gibt nicht dieInhaltder passenden Dateien.

grepWenn diese Liste von Dateinamen mit dem Pipe-Operator übergeben wird, wird die Zeichenfolge (der Dateiname) grepangezeigt undbarnicht foo(der Inhalt der Datei bar).

grepfindet daher keine Übereinstimmung und hat daher nichts auszugeben.

Notiz:

  • grepkönnen Dateien direkt durchsuchen. Sie müssen keine findPipes verwenden |oder xargswie in einer anderen Antwort vorgeschlagen.

Der folgende Befehl funktioniert unter Cygwin:

grep --exclude-dir=* "foo" ./*

Beispiel:

DavidPostill@Hal /f/test
$ cat bar
foo

DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo

Weitere Informationen

  • Ein AZ-Index der Bash-Befehlszeile für Linux- Ein hervorragendes Nachschlagewerk zu allen Themen rund um die Bash-Befehlszeile.
  • finden- Durchsuchen Sie eine Ordnerhierarchie nach Dateinamen, die ein gewünschtes Kriterium erfüllen: Name, Größe, Dateityp.
  • grep- Durchsuchen Sie Dateien nach einem bestimmten Text.

Antwort4

Ich glaube, das willst du.

find . -name '*' -type f -exec grep foo /dev/null {} \;

Sie möchten nur Dateien greppen, keine Verzeichnisse oder spezielle Dateien. /dev/null bewirkt, dass grep den Dateinamen anzeigt. Sie möchten vielleicht '-name '*' loswerden, aber wenn Sie das tun, werden Dot-Dateien greppt.

Sie könnten auch laufen

grep -r foo .

verwandte Informationen