如何在ANT脚本中使用Linux“find”和“-exec”命令?

时间:2016-10-25 14:39:28

标签: bash ant

考虑以下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清除目录及其子目录中所有文件的内容。我的意思是只清除文件内容,而不是删除它们。

1 个答案:

答案 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,因此不需要转义分号。