1

我最近从 Windows 开发环境切换到 Apple 开发环境。此举是一个具有挑战性的过程,但我正在努力在终端中选择基于 UNIX 的命令来补充我每天在 Windows 命令提示符下使用的命令。任何帮助将不胜感激,对提供的命令中发生的事情的基本解释对我来说是一个巨大的好处,因为我试图掌握 UNIX 命令,但是阅读manual 就像阅读外语一样我大部分时间。

这是我的问题:是否有一个单行命令,最好足够短以便记忆,我可以执行该命令来模仿或产生与以下 Windows CMD 命令非常相似的输出:

findstr /s /c:"this piece of text" *.code

我经常在 Windows 上使用此命令来生成一个结果集,该结果集向我显示引号之间的文本驻留在与任何子目录中的 *.code 模式匹配的任何文件中的位置。这可用于检查从服务器拉回的大量文件的版本号,以查找在大型项目中声明变量的位置。输出以这种形式出现:

file1.code: other text this piece of text other text
file2.code: other text this piece of text other text
file3.code: other text this piece of text other text
file4.code: other text this piece of text other text
file5.code: other text this piece of text other text

其他文本是在给定文件中与我的搜索字符串位于同一行的任何其他文本。我在这里搜索了问题,发现有几个人使用find . -name *.code在子目录中构建文件列表。然后,他们使用命令中的-exec标志find与序列配对grep来搜索文本。我以上述几种方式进行了尝试,但都失败了,我认为是由于转义序列或丢失的字符。如果有一种方法可以在它刚刚搜索的引号之间给命令一个字符串,那就太棒了。

我尝试了以下但没有得到任何结果......也许是语法错误?

find . -exec grep -H .getItemToChange().getItemAttributes()

更新 下面提供了正确的代码,John 给出了很好的解释。如果这有助于你喜欢它帮助我给他的答案一个upvote!

我希望在一个大型项目中找到带有此函数调用的 .java 文件。它没有给我任何结果,也没有办法只过滤到 *.java。

有谁可以帮我离开这里吗?非常感谢您对命令的解释。

4

1 回答 1

2
find . -name '*.code' -exec grep -H 'pattern' {} +

确保引用'*.code',以便 shell 不会扩展*通配符。通常我们确实希望 shell 进行扩展,但在这种情况下,我们希望将文字字符串*.code传递给它,find以便它可以自己进行通配符扩展。

使用-exec时需要放在{}某个地方;它是找到的文件名的占位符。您还需要\;+在命令末尾。这就是您向's 参数find的结束位置发出信号的方式(可以在 's 之后进行其他操作)。将导致每个文件运行一次,而对所有文件运行一次。-exec-exec\;grep+grep

find . -name '*.code' -print0 | xargs -0 grep -H 'pattern'

另一种常见的方法是将find和链接在一起xargs。我喜欢使用-exec更好,但find+xargs也同样有效。这里的想法是xargs获取在标准输入上传递的文件名并运行带有这些文件名的命名命令。为了获得传入的文件名的合适列表,我们将find命令的输出通过管道传输到xargs.

-print0选项告诉find打印它找到的每个文件以及一个 NUL 字符 ( \0)。xargs这与's-0选项齐头并进。使用-print0-0确保我们可以正确处理带有不寻常字符(如空格和引号)的文件名。

于 2013-03-14T16:34:17.210 回答