我已经安装了 cygwin,当我用这个命令搜索源代码时,什么也没有显示出来,即使我在文件中有这个字符串
$ echo foo > bar
$ find . -name '*' | grep foo
什么都没显示。此命令在 GNU+Linux 上运行良好。
$ grep foo bar
答案1
如上所述,find 将找到的文件列表输出到 stdout,如果以这种方式调用,grep 通常会通过 stdout 进行搜索。
xargs
也可以通过管道将 find 传递到从标准输入构建并执行命令行“,例如
$ find . | xargs grep foo
如果你有疯狂的文件名,带有换行符和诸如此类的东西,那么这会更好:
$ find . -type f -print0 | xargs -0 grep foo
并且只会找到常规文件,因此不会尝试通过任何或或任何目录或“有趣”的文件-type f
进行 grep 。.
..
答案2
find . -name '*' # This will produce a list of *file names*
然后将文件名列表传递给grep
stdin,它会将列表视为文本并搜索foo
您没有文件名,foo
因此它不返回任何内容。
要通过文件递归搜索查找文件中的文本,您只需使用
grep -R foo somefolder/
答案3
当我用这个命令搜索源代码时,什么也没有出现
$ echo foo > bar
$ find . -name '*' | grep foo
find
搜索符合所需条件的文件名:名称、大小、文件类型,并返回匹配文件名的列表。它不返回内容匹配的文件。
grep
当使用管道运算符传递文件名列表时,grep
将看到字符串bar
(文件名)和不是 foo
(文件的内容bar
)。
grep
因此没有找到匹配项,所以没有任何内容可输出。
笔记:
grep
可以直接搜索文件。您不需要使用find
. 管道|
,或者xargs
按照另一个答案中的建议。
以下命令适用于 Cygwin:
grep --exclude-dir=* "foo" ./*
例子:
DavidPostill@Hal /f/test
$ cat bar
foo
DavidPostill@Hal /f/test
$ grep --exclude-dir=* "foo" ./*
./bar:foo
进一步阅读
- Linux 的 Bash 命令行的 AZ 索引- 与 Bash 命令行相关的所有事物的绝佳参考。
- 寻找- 在文件夹层次结构中搜索符合所需条件的文件名:名称、大小、文件类型。
- grep- 在文件中搜索特定文本。
答案4
我想你想要这个。
find . -name '*' -type f -exec grep foo /dev/null {} \;
您只想 grep 文件,而不是目录或特殊文件。/dev/null 使 grep 显示文件名。您可能想摆脱 '-name '*',但如果您这样做,那么将 grep 点文件。
你也可以运行
grep -r foo .