Як скопіювати каталог за допомогою Ant


99

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

Як можна скопіювати все дерево?


5
Здається, ви хочете зробити рекурсивну копію. І це рішення, яке дав Усюдисущий. Більше людей може зустріти це питання, якщо в питанні з’явилося слово «рекурсивна».
Джейсон

Відповіді:


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

віримо, що зробиш те, що хочеш ... (виконана рекурсивна копія)


3
Мабуть, includesне потрібно, коли все хочеться (див. відповідь користувача s1n )
Abel

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

Вам слід лише вказати каталог (не містить властивість include):

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

Детальнішу інформацію та приклади див. У посібнику .


13
@ s1n Ця команда копіює лише весь вміст src_dir до ../new/dir, а не src_dir. Як ми копіюємо src_dir (каталог) в інше місце?
Піпалаян Наяк


2

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


2

Я використовував теги, як показано на фрагменті коду нижче, в моєму файлі 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

З прикладу тут можна написати простий 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

1

Я додаю більш загальний шаблон для копіювання всіх папок.

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

Докладніше див. Шаблони .


1

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

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

З вашого посилання. Це завдання застаріле. Використовуйте замість цього завдання Copy.
Джим

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>

0

Я нарешті скопіював за допомогою наступного коду

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

Це скопіює папку src з dist для збирання.

Сподіваюся, що це комусь допоможе.


він буквально говорить, що скопіював би навпаки, хоча: P
nonchip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.