查找包含字符串的文件并执行命令

查找包含字符串的文件并执行命令

如何查找包含特定字符串的文件对这些文件执行命令?

就我而言,我想查找*.md包含字符串的所有文件

^  - HIMS$

并使用 git 暂存它们。

我知道我可以通过以下命令找到包含该字符串的文件:grep -rlnw . -e ' - HIMS'

我还知道我可以通过以下方式对找到的文件执行命令find

find ./ -type f -name "*.md" -exec git add "{}" \;

最后,我知道我可以用来查找md文件和 grep:

find . -name '*.md' -exec grep -l '  - HIMS' {} \; -print

我不知道如何才能补充git add这两种方法。

我猜,第三种方法虽然最慢,但可能是值得关注的一点。但我不知道如何附加git add它。

我如何实现这个目标?

答案1

你的第二个find命令:

find . -name '*.md' -exec grep -l '  - HIMS' {} \; -print

在其输出中是多余的。grep -l打印所需文件的路径名,但随后-exec也是 中的测试find。当且仅当执行的实用程序返回退出状态零时,它才成功。退出状态从grep有意反映是否存在匹配,因此该工具可用于这样的测试。如果测试成功,则-print进行评估。它打印grep刚刚打印的路径名。

仔细检查输出,你会看到成对的路径名(行)。每对中第一行是 from grep -l,第二行是 from find -print

现在我们知道-exec了测试,我们可以将其插入到您的第一个find命令中。您的第一个find命令是:

find ./ -type f -name "*.md" -exec git add "{}" \;

-type f是一个测试,-name "*.md"是另一个测试;您可以在之前添加另一个测试-exec git …

find . -type f -name "*.md" -exec grep -q '  - HIMS' {} \; -exec git add {} \;

我使用了-q(quiet) 而不是 ,-l因为我们不需要 中的路径名grep。对于通过前面测试的每个文件,我们希望 中的退出状态为。在第二个命令中grep触发的相同机制现在将触发第二个。-printfind-exec

第二个-exec也是一个测试,但是我们的 中没有进一步的测试或操作find,因此这方面与我们的情况无关。通常-exec允许您构建自定义测试。如果您可以编写 shell 代码或脚本,或者测试所需内容的程序,那么您可以在 中使用它find -exec。这是一个非常强大的工具。

相关内容