Common Ant File Operations — Copy, Move, Delete, Rename

Ant provides a rich set of file operation tasks; they are among the most frequently used features in build scripts.

Copying files/directories

<!-- Copy a single file -->
<copy file="src/config.xml" tofile="dist/config.xml" />

<!-- Copy a file to a directory -->
<copy file="src/config.xml" todir="dist/" />

<!-- Copy an entire directory -->
<copy todir="dist/">
    <fileset dir="src/" />
</copy>

<!-- Filter file types while copying -->
<copy todir="dist/">
    <fileset dir="src/">
        <include name="**/*.xml" />
        <exclude name="**/*.tmp" />
    </fileset>
</copy>

<!-- Copy and overwrite read-only files -->
<copy todir="dist/" overwrite="true">
    <fileset dir="src/" />
</copy>

Moving files/directories

<move file="temp/output.jar" tofile="release/app.jar" />
<move todir="archive/">
    <fileset dir="temp/">
        <include name="*.log" />
    </fileset>
</move>

Deleting files/directories

<!-- Delete a single file -->
<delete file="temp/output.txt" />

<!-- Delete a directory and all its contents -->
<delete dir="build/" />

<!-- Delete by pattern -->
<delete>
    <fileset dir="dist/">
        <include name="**/*.class" />
        <include name="**/*.tmp" />
    </fileset>
</delete>

<!-- Quiet mode: no error if the file does not exist -->
<delete file="temp/output.txt" quiet="true" />

Renaming

Ant has no separate rename task; use <move> instead:

<move file="app-old.jar" tofile="app-new.jar" />

Creating directories

<mkdir dir="dist/lib/" />

Parent directories are created automatically when they don’t exist, so you don’t need to mkdir level by level.

Replacing text in files

<replace file="config.properties" token="@VERSION@" value="${app.version}" />

Replace across all files in a directory:

<replace dir="dist/" token="@BUILD_TIME@" value="${build.time}">
    <include name="**/*.html" />
    <include name="**/*.js" />
</replace>

Packaging (Zip/Tar)

<zip destfile="release/app-${app.version}.zip" basedir="dist/" />

<!-- Exclude certain files -->
<zip destfile="release/app.zip">
    <fileset dir="dist/">
        <exclude name="**/*.log" />
    </fileset>
</zip>

A small step forward every day is a new height!