1

2つのディレクトリツリーがあります。

source/aaa/bbb/ccc/file01.txt
source/aaa/bbb/file02.txt
source/aaa/bbb/file03.txt
source/aaa/ddd/file03.txt
source/file01.txt

template/aaa/bbb/ccc/file01.txt
template/aaa/bbb/DELETE-file03.txt
template/aaa/DELETE-ddd
template/DELETE-file01.txt

Antを使って、3つのことをしたいと思います。まず、「template」から「source」にファイルをコピーして、「DELETE-」で始まらないすべてのファイルを置き換えます。たとえば、「source / aaa / bbb / ccc/file01.txt」は置き換えられます。これは簡単です:

<copy todir="source" verbose="true" overwrite="true">
    <fileset dir="template">
        <exclude name="**/DELETE-*"/>
    </fileset>
</copy>

次に、「テンプレート」ツリーの対応するディレクトリにある「DELETE-」ファイルと名前が一致する「ソース」ツリー内のすべてのファイルを削除します。たとえば、「source / aaa / bbb/file03.txt」と「source/file01.txt」の両方が削除されます。私はこれを次の方法で達成することができました:

<delete verbose="true">
    <fileset dir="source">
        <present present="both" targetdir="template">
            <mapper type="regexp" from="(.*[/\\])?([^/\\]+)" to="\1DELETE-\2"/>
        </present>
    </fileset>
</delete>   

第三に、同じように名前が一致するディレクトリ(空かどうか)を削除したいと思います。たとえば、「template / aaa/DELETE-ddd」とその下のすべてのファイルが削除されます。「テンプレート」ツリーにDELETE-*ファイルがある「ソース」ツリーのディレクトリ(およびその下のすべてのファイル)に一致するファイルセットを作成する方法がわかりません。

この3番目のタスクはAnt(1.7.1)でも可能ですか?できれば、カスタムのantタスク/セレクターを記述せずにこれを実行したいと思います。

4

2 に答える 2

1

これを困難にする根本的な問題は、antがファイルセットのターゲットディレクトリ内にあるファイルに基づいてセレクター/ファイルセットを駆動することであるように思われます。ただし、通常は、DELETE-*マーカーファイルのリストから物事を推進する必要があります。

私がこれまでに見つけた最良の解決策には、いくつかのカスタムコードが必要です。私はタスクを選択しました<groovy>が、を使用することもでき<script>ました。

要点:ファイルセットを作成し、groovyを使用して、DELETE- *マーカーでファイルとディレクトリをスキップする一連の除外を追加してから、コピーを実行します。これで、私の質問の2番目と3番目のタスクが完了します。

<fileset id="source_files" dir="source"/>

<!-- add exclude patterns to fileset that will skip any files with a DELETE-* marker -->
<groovy><![CDATA[
    def excludes = []
    new File( "template" ).eachFileRecurse(){ File templateFile ->
        if( templateFile.name =~ /DELETE-*/ ){
            // file path relative to template dir
            def relativeFile = templateFile.toString().substring( "template".length() )
            // filename with DELETE- prefix removed
            def withoutPrefix = relativeFile.replaceFirst( "DELETE-", "")
            // add wildcard to match all files under directories
            def exclude = withoutPrefix + "/**"
            excludes << exclude
        }
    }
    def fileSet = project.getReference("source_files")
    fileSet.appendExcludes(excludes as String[])
]]></groovy>

<!-- create a baseline copy, excluding files with DELETE-* markers in the template directories -->
<copy todir="target">
    <fileset refid="source_files"/>
</copy>
于 2012-04-20T15:09:42.070 に答える
0

ディレクトリとその内容を削除するには、次を使用しますdelete with nested fileset

 <delete includeemptydirs="true">
  <fileset dir="your/root/directory" defaultexcludes="false">
   <include name="**/DELETE-*/**" />
  </fileset>
 </delete>

属性を使用includeemptydirs="true"すると、ディレクトリも削除されます。

于 2012-04-18T06:03:07.113 に答える