Как скопировать каталог с помощью Ant

99

Я использовал copydirдля копирования дерева каталогов, но он устарел. Мой каталог содержит некоторые подкаталоги, некоторые из них содержат файлы, а другие содержат дополнительные подкаталоги.

Как мне скопировать все дерево?

Сунил Кумар Саху
источник
5
Похоже, вы хотите сделать рекурсивную копию. И это решение, которое дал Omnipresent. Больше людей могут найти этот вопрос, если в нем появилось слово «рекурсивный».
Джейсон

Ответы:

113
<copy todir="${dest.dir}" >  
    <fileset dir="${src.dir}" includes="**"/>  
</copy> 

верю, что сделает то, что вы хотите ... (Рекурсивная копия сделана)

Вездесущий
источник
3
очевидно, в includesэтом нет необходимости, когда вам нужно все (см. ответ пользователя s1n )
Абель
40
Это копирует содержимое {src.dir}, но не фактический каталог
cmcginty
Копии не сделал, но это содержание.
A-Live
Поскольку вы являетесь принятым ответом, вы можете исправить его, чтобы он стал правильным (ответ правильный) ;-)
Кристиан Фрайс
Я так понимаю, идея SO - это коллективное курирование, поэтому каждый может редактировать чужой вопрос (хотя вам нужно много репутации, чтобы пропустить обзор редактирования).
Эндрю Спенсер
117

Скопируйте содержимое, включая сам каталог.

<copy todir="${dest.dir}" >  
    <fileset dir="${src.dir.parent}">  
        <include name="${src.dir}/**"/>
    </fileset>
</copy>

Примечание: $ {src.dir} относится к $ {src.dir.parent}, а не к полному пути

эри
источник
12
это должен быть ПРАВИЛЬНЫЙ ответ. Другой ответ - на вопрос «Как скопировать содержимое каталога с помощью Ant». Есть небольшая разница.
cmcginty
«это должен быть ПРАВИЛЬНЫЙ ответ»: Абсолютно, хотя разница не так уж и незаметна, когда вы не можете загрузить свои ресурсы с ожидаемыми именами пути.
Джим Пиварски
1
для муравья 1.8 не работает, вроде ничего не вышло.
CCC
8
@CCC обеспечить $ {src.dir} является по отношению к $ {src.dir.parent}, а не полный путь
Майк Деменок
очень вводит в заблуждение , как x.parentпредполагается, НЕ БУДЬТЕ parentиз x... -_-
nonchip
25

Вам нужно только указать каталог (без свойства includes):

<copy todir="../new/dir">
    <fileset dir="src_dir"/>
</copy>

Смотрите руководство для более подробной информации и примеров.

s1n
источник
13
@ s1n Эта команда копирует только все содержимое src_dir в ../new/dir, но не в src_dir. Как скопировать src_dir (каталог) в другое место?
Пипалаян Наяк,
14

Скопируйте содержимое, включая сам каталог.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
источник
2
Это самый емкий вариант. См. Также ant.apache.org/manual/Types/fileset.html .
Джесс
2

Замечание: ant будет копировать подкаталоги только в том случае, если исходные файлы новее, чем файлы назначения. [1] В моем случае подкаталоги не копировались (я использую verbose = "true"), так как изменений не было и они уже были в месте назначения. Вы можете использовать "перезапись", чтобы заставить его, или коснуться некоторых файлов в ваших исходных подкаталогах.

Джесс
источник
2

Я использовал теги include, как показано во фрагменте кода ниже в моем файле build.xml, чтобы скопировать отдельные файлы jar внутри каталога.

<target name="devInstall" depends="generateXsl" description="testing">
<copy flatten="true" todir="${test}/WEB-INF/lib" overwrite="${overwrite}">
                <fileset refid="buildJars"/>
                <fileset dir="lib">
                    <include name="commons-collections-*.jar"/>
                    <include name="commons-io-*.jar"/>              
                    <include name="kodo/*.jar"/>
                    <include name="mail*.jar"/>    
                    <include name="activation*.jar"/>               
                    <include name="guava*.jar"/>
                    <include name="jna*.jar"/>                          
                </fileset>          
            </copy>
</target>
Раман B
источник
1

Из приведенного здесь примера вы можете написать простой файл Ant с помощью задачи копирования.

<project name="MyProject" default="copy" basedir=".">
    <target name="copy">
        <copy todir="./new/dir">
           <fileset dir="src_dir"/>
        </copy>
    </target>
</project>

Это должно скопировать все внутри src_dir(кроме него) в new/dir.

NawaMan
источник
6
это просто копирование содержимого каталога. не содержание, включая непосредственно. :(
ghostCoder
1

Я добавляю более общий шаблон для копирования всех вложенных папок.

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir}" includes="**/*"/>
</copy>

См. Подробности в шаблонах .

портняжник
источник
1

Еще одна задача для муравьев - Copydir . Ключевой частью здесь является включение имени каталога, который вы хотите скопировать, после каталога назначения. Подкаталоги и файлы будут скопированы автоматически.

<target name="-post-jar">
    <copydir src="config" dest="${dist.dir}/config/"/>
</target>
Андрей
источник
По вашей ссылке: эта задача устарела. Вместо этого используйте задачу копирования.
Джим
0

Этот код должен копировать папку, а также ее содержимое. Он также использует задачу базового имени, чтобы избежать ручного анализа пути.

<project name="Build" default="doCopy">
  <property name="source.dir" value="SourceDirPathGoesHere"/>
  <property name="dest.dir" value="DestinationDirPathGoesHere"/>
  <target name="doCopy">
    <basename property="source.dir.base.name" file="${source.dir}"/>
    <copy todir="${dest.dir}">
      <fileset dir="${source.dir}/.." includes="${source.dir.base.name}/**"/>
    </copy>
  </target>
</project>
user506069
источник
0

Я наконец скопировал, используя следующий код

<copy todir="${root.dir}/dist/src">  
                <fileset dir="${root.dir}/build/src" includes="**"/>  
            </copy>

Это скопирует папку src из dist в build.

Надеюсь, это кому-то поможет.

Дилип Раджкумар
источник
он буквально говорит, что будет копировать наоборот: P
nonchip