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

How to use Linux "find" with "-exec" command within an ANT script?

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

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 在启动 find 之前用引号将 dd if=/dev/null of={} \; 括起来。 find运行s时,-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=";"/> 在分号前没有反斜杠。当从 shell(例如 Bash)中 运行 宁 find 时,反斜杠是必需的。但是,Ant 脚本不调用 shell,因此无需转义分号。