这些花括号被bash留下;它们分别属于find和xargs,并在其手册页中进行了描述。
man find
-exec 命令 ;
执行命令 ; 如果返回0状态,则为true。以下所有要查找的参数都将作为命令的参数,直到;遇到由组成的参数。该字符串{}会被当前文件名替换,该文件名会在命令参数中出现的所有位置处进行处理,而不仅仅是在单独存在的参数中(如在某些版本的中)find。这两种构造都可能需要转义(带有\)或加引号,以防止它们被外壳扩展。有关使用该-exec选项的示例,请参见“示例”部分。指定
命令每个匹配的文件运行一次。该命令在起始目录中执行。围绕操作的使用存在不可避免的安全问题-exec
。您应该改用该-execdir选项。
-exec 命令 {} +
此操作的变体在选定的文件上-exec运行指定的命令,但是通过在每个文件的末尾附加每个选定的文件名来构建命令行。该命令的调用总数将远远少于匹配文件的数目。命令行的构建与xargs构建命令行的方式几乎相同。命令中仅{}允许的一个实例。该命令在起始目录中执行。如果find遇到错误,有时可能会导致立即退出,因此某些挂起的命令可能根本不会运行。此变量的-exec始终返回true。
-execdir 命令 ;
-execdir 命令 {} +
与相似 -exec,但是指定的命令从包含匹配文件的子目录运行,该目录通常不是您开始查找的目录。这是一种用于调用命令的更为安全的方法,因为它避免了在解析匹配文件的路径期间出现争用情况。与该 -exec 操作一样,的
+ 形式 -execdir 将构建命令行以处理多个匹配文件,但是任何给定的命令调用将仅列出存在于同一子目录中的文件。如果使用此选项,则必须确保您的$PATH环境变量未引用.; 否则,攻击者可以通过在要运行的目录中保留一个适当命名的文件来运行所需的任何命令-execdir。条目$PATH为空或不是绝对目录名的条目也是如此。如果find遇到错误,有时可能会导致立即退出,因此某些挂起的命令可能根本不会运行。动作的结果取决于是否使用+或;变体。
-execdir command {} +始终返回true,而仅当command返回0 时-execdir command才 {} ;返回true 。
man xargs
-I replace-str
将初始参数中出现的replace-str替换为从标准输入中读取的名称。同样,未加引号的空格也不会终止输入项目。相反,分隔符是换行符。表示-x和-L 1。
-i[ replace-str ],--replace[ =replace-str ]
此选项的代名词-I顶替-STR如果更换-STR指定的。如果缺少replace-str参数,则效果与相同-I{}。不建议使用此选项;使用-I代替。
编辑:在这里,为什么 bash忽略了那些花括号:
man bash
{ 清单; }
list 仅在当前的shell环境中执行。 列表必须以换行符或分号终止。这称为组命令。返回状态是列表的退出状态。请注意,与元字符(和)不同,{和}是保留字,并且必须出现在允许识别保留字的位置。由于它们不会造成单词中断,因此必须使用空格或其他shell元字符将它们与list分开。
为了强调:list必须以换行符或分号终止。
{}-意味着targets要执行find命令,即删除/rm找到文件。