Использование mapper & fileset для копирования файлов в другой подкаталог? - PullRequest
8 голосов
/ 18 ноября 2010

Я хочу создать цель Ant, которая копирует файлы из каталога в каталог назначения с такой же структурой папок, плюс еще одна вложенная папка.

Например, источник:

a/b/c/foo.pdf
d/e/f/bar.pdf

Я хочу, чтобы пункт назначения был:

a/b/c/x/foo.pdf
d/e/f/x/foo.pdf

Вот моя цель, но она ничего не делает:

<copy todir="${dest.dir}">
   <fileset dir="${src.dir}" casesensitive="yes">
       <include name="**${file.separator}foo.pdf" />
   </fileset>      
   <mapper type="glob"
           from="foo.pdf" to="x${file.separator}foo.pdf" />            
</copy>

Чего мне не хватает?

1 Ответ

12 голосов
/ 18 ноября 2010

Вы можете использовать regexp mapper:

<copy todir="${dest.dir}">
    <fileset dir="${src.dir}" casesensitive="yes">
        <include name="**/*.pdf"/>
    </fileset>
    <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" />
</copy>

Я использовал жестко закодированные file.separators для сокращения.По сути, вы разделяете путь к входному файлу (из) на каталог и имя файла (захват \1 и \2), а затем вставляете дополнительный элемент \x между ними (в).

I 'На вашем примере это непонятно - похоже, вы хотите сопоставить bar.pdf и переименовать его в foo.pdf, а также изменить каталог.Если вам нужно это сделать, вы можете рассмотреть создание цепочки из нескольких простых сопоставителей регулярных выражений, а не пытаться создать один сложный:

<copy todir="${dest.dir}">
    <fileset dir="${src.dir}" casesensitive="yes">
        <include name="**/*.pdf"/>
    </fileset>
    <chainedmapper>
        <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/x/\2" />
        <mapper type="regexp" from="^(.*)/(.*\.pdf)" to="\1/foo.pdf" />
    </chainedmapper>
</copy>

При использовании сопоставителя glob, вам необходимо указать один подстановочный знак * в поле from:

Требуются оба к и от, и определить шаблоны, которые могут содержать не более одного *.Для каждого исходного файла, который соответствует шаблону from, имя целевого файла будет построено из шаблона to, заменив * в шаблоне to текстом, который соответствует * в шаблоне from.Имена исходных файлов, которые не соответствуют шаблону from, будут игнорироваться.

Так что-то подобное может работать:

<mapper type="glob" from="*/foo.pdf" to="*/x/foo.pdf" />
...