Ant パターン(Pattern)について
Antではファイル名を指定するのに、正規表現とは別のパターンを用います。
パターン
わかりにくい場合は以下のようにすると該当結果を出力できますので
確認しながらパターンを作りましょう。
<path id="pathid"> <fileset dir="."> <include name="**.txt"/> </fileset> </path> <property name="test" refid="pathid"/> <echo message="${test}"/>
すべてのファイルを指定(*)
始まる
java*
としてするとjavaで始まるファイルを指定できます。
終わる
*.java
と指定すると拡張子がjavaのファイルを指定できます。
すべて
*
複雑
t*t*.txt
とするとtから始まり、tを含み、拡張子が.txtのファイルを選択します。
ただし、*の所には絶対に何かの文字が必要というわけではありません。
つまり、先ほどの例ですとtt.txtファイルは選択されます。
すべての、ファイル又はフォルダーを指定(**)
filesetではfileしか選択されません。dirsetでdirectory/folderを選択できます。
始まる
img**
imgで始まるフォルダーに該当します。
終わる
**testでtestで終わるフォルダー名に該当します。
すべて
**
すべてのフォルダー・ファイルに該当します。
組み合わせ
指定ディレクトリー以下
img/**
現在の位置のimg以下のファイルやフォルダーを指定できます。
basedirをimgにすればいいのですが、このimgというファイル構造も保持したい時にはこのようなパターンになると思います。
フォルダー中のファイル
**/img/*
すべてのimgというフォルダー中のファイル
img中のサブディレクトリー以下のファイルやフォルダーは該当しません。
ちなみに、img/というフォルダー以下のファイルも該当します。
フォルダー中のフォルダー以下のファイルやフォルダー
**/img/**
こちらですとimgというフォルダー以下のファイルとフォルダー両方に該当します。
まとめ
*がファイルのみ、**がファイルとフォルダー / があるとディレクトリー以下を見に行く
あくまでパターンなのでファイルのリストとかフォルダーのリストはfilesetやdirsetなどに依存します。
タグと属性
includeとexclude
includeとexcludeの違いは、includeの方はファイルを含むかどうかであり、excludeの方はファイルを除くかどうかです。
パターンが指定されていない場合、<fileset>のdir属性で指定したファイルすべてを含みます。
default excludes
ただし例外のファイルがあります。これはdefault excludesと呼ばれるもので、CVSファイルなどのファイルを指定から除外します。
この除外を解除するには、defaultexcludes属性をnoとする必要があります。またこのdefault excludesはdefaultexcludesタスクを使うことでカスタマイズすることが可能です。
**/*~ **/#*# **/.#* **/%*% **/._* **/CVS **/CVS/** **/.cvsignore **/SCCS **/SCCS/** **/vssver.scc **/.svn **/.svn/** **/.DS_Store
include
<fileset>だけですとすべてのファイルを含みます。
もし指定が、includeだけならば、fileset中のファイルの中から、includeで指定されたパターンに該当するファイルだけが選択されます。
(default excludesは除く)
include
もし指定が、excludeだけならば、fileset中のファイルの中から、excludeで指定されたパターンに該当するファイルを除いたファイルが選択されます。
(default excludesは除く)
include+exclude
もしincludeとexcludeの指定があった場合
fileset中のファイルの中から、includeで指定されたパターンに該当するのうち、excludeに該当するファイルを除いたものが選択されます。
(default excludesは除く)
include/excludeとincludesfile/excludesfile
sfileが付いているかいないかの違いは、パターンをname属性の所に記述するか、
パターンをname属性で記述したファイルから読み込むかの違いです。
includeの方はパターンを一つしか記述できません。
includesfileの方は、ファイル名は一つしか記述できませんが、そのファイルにはパターンを改行で区切ることで複数記述することができます。
<fileset dir="."> <includesfile name="pattern.txt"/> </fileset> #br
[pattern.txt]
test1.txt test2.txt test3.txt
属性のincludesfileと要素のincludesfile、どちらも一つのファイル名しか記述できません。
よく使うパターンをファイルでまとめておくといいでしょう。
[例:パッケージ用]
**/*.java **/*.class **/*.properties
include/excludeとincludes/excludes
<fileset>を例に取ると、属性で指定する場合にはsが付いてます。
このsの意味は、複数指定できるということです。
半角スペースとカンマ(,)でパターンを区切ることができます。
<fileset dir="." includes="test1.txt,test2.txt test3.txt"> </fileset>
一方で要素であるincludeにはsが付いていません。
すなわち単独のパターンのみ指定します。カンマやスペースもパターンのファイル名パターンとして扱われます。
従って、ファイル名にカンマやスペースを含む場合は、include要素を使いましょう。
複数のパターンを記述したい場合は、要素を複数記述します。
<fileset dir="."> <include name="test1.txt"/> <include name="test2.txt"/> <include name="test3.txt"/> </fileset>
Patternset
普段よく使う、パターンはPatternセットとしてまとめることができます。
後はこれをrefidで呼び出すことで効率的に記述することが可能です。