Unix的find命令,{}和\;分别代表什么?

20

使用这组命令时,{}\; 字符用于什么?

find . -name '*.clj' -exec grep -r resources {} \;

2
请注意,“grep -r”仅在那些.clj文件是目录时才需要。find默认是递归的,因此不需要grep。(grep将被馈送到每个文件中)。您可能还想使用xargs,因为使用当前命令,您将无法知道从哪些文件中获取了结果。 - PEZ
5个回答

34

请查看man find (特别是关于 -exec 的部分)。

当使用-exec在找到的每个文件上运行命令时,{}会被替换为找到的每个文件的名称,并且该命令以\;结束。

在您的示例中,所有在当前目录(.)下找到的匹配名称*.clj的文件将对它们运行grep -r resources 命令(如果该字符串存在于这些文件中,则查找字符串resources)。

实际上有点多余,因为-r用于递归地搜索子目录,而这正是find已经在执行的操作。


我没有想到要查找man find,因为它看起来不像是find命令的一部分,就像一个shell扩展、管道或其他重定向操作符也不是它旁边找到的命令的一部分一样。我以为它是一些shell语法魔法,如果不知道它的名称,我就无法识别它。 - temporary_user_name

4
在find命令中,-exec参数会获取剩余的参数直到分号(;),需要对分号进行转义,因此使用\;。在这个范围内,{}会被替换为正在检查的文件名。

2
考虑以下更易理解的替代命令:
find . -name *.clj | xargs grep -r resources 

3
但是它的主要缺陷在于无法正确处理文件名中包含空格或类似字符的文件。 - jlliagre

1
find中,字符串{}将被当前文件的路径名替换。
分号用于终止由find实用程序调用的shell命令。
需要对其进行转义或引用,以使其不被shell解释,因为;是shell使用的特殊字符之一(列表运算符)。
另请参阅:为什么在find命令的-exec选项中需要反斜杠和分号?

1

字符串“{}”将被当前处理的文件替换。转义的分号终止了-exec选项的命令参数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接