2009-11-06 4 views
87

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

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

+5

Похоже, вы хотите сделать рекурсивную копию. И это решение, которое Вездесущий дал. Больше людей может найти этот вопрос, если в вопросе появится слово «рекурсивный». – Jason

ответ

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

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

+2

, по-видимому, 'include' не требуется, когда вы хотите все (см. Ответ от пользователя * s1n *) – Abel

+30

Это копирует содержимое {src.dir}, но не фактический каталог – cmcginty

+0

Копии не сделаны, а его содержимое. –

23

Вы должны указать только каталог (без включает имущество):

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

См manual для получения более подробной информации и примеров.

+12

@ s1n Эта команда копирует все содержимое файла src_dir в ./new/dir, а не src_dir. Как скопировать src_dir (каталог) в другое место? –

1

Из примера here вы можете написать простой файл 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.

+6

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

87

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

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

это должен быть правильный ответ. Другой ответ на вопрос «Как скопировать содержимое каталога с помощью Ant». Существует тонкая разница. – cmcginty

+0

«это должен быть ПРАВИЛЬНЫЙ ответ»: Абсолютно, хотя разница не настолько тонкая, когда вы не можете загрузить свои ресурсы с ожидаемыми именами путей. –

+1

не работает для муравья 1.8, кажется, ничего не произошло. – CCC

1

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

10

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

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

Это наиболее краткий вариант. См. также http://ant.apache.org/manual/Types/fileset.html. – Jess

0

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

<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> 
0

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

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

Это будет скопировать папку Src из дист строить.

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

1

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

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

Для получения более подробной информации см. Patterns.

1

Я использовал теги 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> 
1

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

<target name="-post-jar"> 
    <copydir src="config" dest="${dist.dir}/config/"/> 
</target> 
+0

Из вашей ссылки: ** Эта задача устарел. Вместо этого используйте задачу «Копировать». ** – Jim

Смежные вопросы