AbstProcDo Asked: 2018-11-05 17:04:25 +0800 CST2018-11-05 17:04:25 +0800 CST 2018-11-05 17:04:25 +0800 CST for循环挂起不执行 772 我试图heaq在 *.md 文件中找到所有包含 word 的行 $ for i in $(find . -regex ".*md$"); do grep -i "heaq"; done #pending #pending 但是,它一直在那里悬而未决。 我的代码有什么问题? bash find 2 个回答 Voted Best Answer Kusalananda 2018-11-05T22:50:13+08:002018-11-05T22:50:13+08:00 它是grep“未决”的。当grep在没有文件名的情况下运行时,它将读取标准输入。如果您不在标准输入上提供任何数据,它将看起来“挂起”。 您还循环遍历find. 这是不优雅的(循环不会运行,直到所有路径名都被 找到find)并且很危险(路径名将按空格拆分,shell 将对它们执行文件名匹配)。 相反,如果您想对grep具有特定文件名后缀的所有文件运行: find . -type f -name '*.md' -exec grep -iF 'heaq' {} + 我已将其更改-regex为标准-name测试,其模式仅匹配具有.md文件名后缀的文件名。我还添加-type f了它,因为它只在常规文件上运行才有意义grep(您可能希望更改-type f为! -type d在任何非目录上运行它)。 在找到的路径名上分批grep执行-exec。我使用-Fwithgrep因为我们匹配的是字符串,而不是正则表达式。-w如果你想匹配一个词而不是任何子字符串,你可能想要添加。 有关的: 为什么循环查找的输出是不好的做法? 了解 `find` 的 -exec 选项 Rio6 2018-11-05T17:23:51+08:002018-11-05T17:23:51+08:00 您需要将文件名传递给grep 很喜欢 $ for i in $(find . -regex ".*md$"); do grep -i "heaq" $i; done 你也可以使用 % grep -i -n "heaq" $(find . -regex ".*md$") -n使 grep 打印出匹配的行号
它是
grep
“未决”的。当grep
在没有文件名的情况下运行时,它将读取标准输入。如果您不在标准输入上提供任何数据,它将看起来“挂起”。您还循环遍历
find
. 这是不优雅的(循环不会运行,直到所有路径名都被 找到find
)并且很危险(路径名将按空格拆分,shell 将对它们执行文件名匹配)。相反,如果您想对
grep
具有特定文件名后缀的所有文件运行:我已将其更改
-regex
为标准-name
测试,其模式仅匹配具有.md
文件名后缀的文件名。我还添加-type f
了它,因为它只在常规文件上运行才有意义grep
(您可能希望更改-type f
为! -type d
在任何非目录上运行它)。在找到的路径名上分批
grep
执行-exec
。我使用-F
withgrep
因为我们匹配的是字符串,而不是正则表达式。-w
如果你想匹配一个词而不是任何子字符串,你可能想要添加。有关的:
您需要将文件名传递给
grep
很喜欢
你也可以使用
-n
使 grep 打印出匹配的行号