想要列出所有包含“def test”的python测试脚本
该命令行不起作用,而单个命令起作用
find . -name "*.py" | grep "def test"
答案1
尝试:
grep -r --include '*.py' 'def test'
-r
告诉 grep 递归搜索文件--include '*.py'
告诉 grep 只检查名称以.py
.
--include
两者都支持该选项GNU (Linux) grep和MacOS grep
管道方法的讨论
在以下命令中,find 将找到的文件的名称传递到 grep 的标准输入:
find . -name "*.py" | grep "def test"
这里的问题是 grep 将其标准输入视为要搜索的文本。因此,唯一的输出将是那些文件姓名(与内容相对)包含def test
.
例如,让我们创建一个空文件:
$ touch 'def test.py'
并运行管道命令:
$ find . -name "*.py" | grep "def test"
./def test.py
该命令根据其名称找到该文件。它的内容从未被检查过。
答案2
find . -name '*.py' -exec grep -l 'def test' {} \;
或者
find . -name '*.py' -exec grep -l 'def test' {} +
grep
第二个版本将通过指定文件集作为参数来减少调用。
答案3
grep -ril 'def test' .
上面的命令会列出您正在查找的内容。
在命令中 - 选项 ril 指的是递归(r)不区分大小写(i)搜索和仅列出(l)文件名
答案4
对找到的文件执行命令的标准方法find
是使用 xargs:
find . -name "*.py" | xargs grep "def test"
对于 grep,您可以使用递归 grep 而不是 find + grep,正如其他答案所解释的那样,但 xargs 很高兴知道,因为它是一种通用方法,也可用于其他用例。
(正如 Doug O'Neal 评论的那样:如果文件名带有空格,则必须告诉 find 和 xargs 使用空字符作为终止符find . -name "*.py" -print0 | xargs -0 grep "def test"
:)