考虑以下ANT脚本:
<project name="MyProject" default="mainTarget" basedir=".">
<target name="mainTarget">
<exec executable="find">
<arg value="/home/user/Downloads/"/>
<arg value="-type"/>
<arg value="f"/>
<arg value="-exec"/>
<arg value="dd if=/dev/null of={} \;"/>
</exec>
</target>
</project>
输出结果为:
Buildfile: /home/user/workspace/ant/build.xml
wrap:
[exec] find: missing argument to `-exec'
[exec] Result: 1
BUILD SUCCESSFUL
Total time: 0 seconds
我的主要目标是使用ANT清除目录及其子目录中所有文件的内容。我的意思是只清除文件内容,而不是删除它们。
答案 0 :(得分:3)
find
程序很不寻常,因为-exec
选项不会采用单个参数。相反,find
继续在-exec
选项之后读取参数,直到它发现一个分号(;
)或加号(+
)的参数。
在你的例子中......
<exec executable="find">
<arg value="/home/user/Downloads/"/>
<arg value="-type"/>
<arg value="f"/>
<arg value="-exec"/>
<arg value="dd if=/dev/null of={} \;"/>
</exec>
... Ant在启动dd if=/dev/null of={} \;
之前在find
周围包装引号。运行find
时,只有一个参数位于-exec
之后:"dd if=/dev/null of={} \;"
。 find
报告错误,因为没有任何参数只是;
或+
。
让Ant运行find
,将dd
命令拆分为多个<arg>
元素......
<exec executable="find">
<arg value="/home/user/Downloads"/>
<arg value="-type"/>
<arg value="f"/>
<arg value="-exec"/>
<arg value="dd"/>
<arg value="if=/dev/null"/>
<arg value="of={}"/>
<arg value=";"/>
</exec>
请注意,最后一个参数<arg value=";"/>
在分号前没有反斜杠。从Bash等shell运行find
时需要反斜杠。但是,Ant脚本不会调用shell,因此不需要转义分号。