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 xargs
und 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 f
zu durchsuchen ..
..
Antwort2
find . -name '*' # This will produce a list of *file names*
Sie übergeben dann Ihre Liste der Dateinamen an grep
stdin, es behandelt die Liste als Text und sucht nachfoo
Sie haben keinen Dateinamen, foo
daher 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
find
sucht 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.
grep
Wenn diese Liste von Dateinamen mit dem Pipe-Operator übergeben wird, wird die Zeichenfolge (der Dateiname) grep
angezeigt undbar
nicht foo
(der Inhalt der Datei bar
).
grep
findet daher keine Übereinstimmung und hat daher nichts auszugeben.
Notiz:
grep
können Dateien direkt durchsuchen. Sie müssen keinefind
Pipes verwenden|
oderxargs
wie 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 .