如何查找包含特定字符串的文件和对这些文件执行命令?
就我而言,我想查找*.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
触发的相同机制现在将触发第二个。-print
find
-exec
第二个-exec
也是一个测试,但是我们的 中没有进一步的测试或操作find
,因此这方面与我们的情况无关。通常-exec
允许您构建自定义测试。如果您可以编写 shell 代码或脚本,或者测试所需内容的程序,那么您可以在 中使用它find -exec
。这是一个非常强大的工具。