Reputation: 631
I have added a target in a build file to delete backups that are older than 4 days by using a timestamp:
<tstamp>
<format pattern="MM/DD/yyyy HH:MM aa" offset="-4" property="backup.deletedate" />
</tstamp>
<echo message="Deleting log directories created on or before ${backup.deletedate}" />
<delete verbose="true">
<dirset dir="${backup.dir}/CI">
<date datetime="${backup.deletedate}" when="before" checkdirs="true" />
</dirset>
<dirset dir="${backup.dir}/DEV_MASTER">
<date datetime="${backup.deletedate}" when="before" checkdirs="true" />
</dirset>
</delete>
However it ony deletes from the first directory (CI) and skips the second.
How can I set it to remove from BOTH directories?
Upvotes: 1
Views: 1679
Reputation: 3320
Here is a solution using the exec
task for deleting first level sub-directories (useful for cleaning a nightly build system):
<exec executable="find" osfamily="unix">
<arg value="path/to/dir" />
<arg value="-mindepth" />
<arg value="1" />
<arg value="-maxdepth" />
<arg value="1" />
<arg value="-type" />
<arg value="d" />
<arg value="-mtime" />
<arg value="+4" />
<arg value="-exec" />
<arg value="rm" />
<arg value="-rf" />
<arg value="{}" />
<arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
<arg value="/P" />
<arg value="path\to\dir" />
<arg value="/D" />
<arg value="-4" />
<arg value="/C" />
<arg value="cmd /c IF @isdir == TRUE rd /S /Q @path" />
</exec>
If you don't need to limit to first level subdirectories, you can use the following:
<exec executable="find" osfamily="unix">
<arg value="path/to/dir" />
<arg value="-mindepth" />
<arg value="1" />
<arg value="-type" />
<arg value="d" />
<arg value="-mtime" />
<arg value="+4" />
<arg value="-exec" />
<arg value="rm" />
<arg value="-rf" />
<arg value="{}" />
<arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
<arg value="/P" />
<arg value="path\to\dir" />
<arg value="/D" />
<arg value="-4" />
<arg value="/S" />
<arg value="/C" />
<arg value="cmd /c IF @isdir == TRUE rd /S /Q @path" />
</exec>
If you need to include files too, use the following:
<exec executable="find" osfamily="unix">
<arg value="path/to/dir" />
<arg value="-mindepth" />
<arg value="1" />
<arg value="-mtime" />
<arg value="+4" />
<arg value="-exec" />
<arg value="rm" />
<arg value="-rf" />
<arg value="{}" />
<arg value="\;" />
</exec>
<exec executable="FORFILES" osfamily="windows">
<arg value="/P" />
<arg value="path\to\dir" />
<arg value="/D" />
<arg value="-4" />
<arg value="/S" />
<arg value="/C" />
<arg value="cmd /c IF @isdir == TRUE rd /S /Q @path ELSE del /F /Q @path" />
</exec>
It works on Windows and Linux systems. One advantage over the pure Ant deletion is that ant does not generate any fileset and so is possibly faster.
Upvotes: 0
Reputation: 631
Seems the dirset collection was skipping non-empty directories. I overcame it by using a fileset for the entire backup dir:
<tstamp>
<format pattern="MM/DD/yyyy HH:MM aa" offset="-4" property="backup.deletedate" />
</tstamp>
<echo message="Deleting log directories created on or before ${backup.deletedate}" />
<delete verbose="true" includeemptydirs="true">
<fileset dir="${backup.dir}">
<date datetime="${backup.deletedate}" when="before" checkdirs="true" />
</fileset>
</delete>
Works like a charm!
Upvotes: 1
Reputation: 35169
Merge your dirsets.
<delete verbose="true">
<dirset dir="${backup.dir}" includes="CI,DEV_MASTER">
<date datetime="${backup.deletedate}" when="before" checkdirs="true" />
</dirset>
</delete>
Upvotes: 0