Como copiar um diretório usando Ant


99

Eu costumava copydircopiar uma árvore de diretórios, mas ela está obsoleta. Meu diretório contém alguns subdiretórios, e alguns deles contêm arquivos e outros contêm mais subdiretórios.

Como posso copiar a árvore inteira?


5
Parece que você deseja fazer uma cópia recursiva. E essa é a solução que o Onipresente deu. Mais pessoas podem encontrar essa pergunta se a palavra "recursiva" aparecer na pergunta.
Jason

Respostas:


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

acredite que vai fazer o que quiser ... (cópia recursiva feita)


3
aparentemente, o includesnão é necessário quando você quer tudo (ver a resposta do usuário s1n )
Abel

40
Isso copia o conteúdo de {src.dir}, mas não o diretório real
cmcginty

As cópias não foram feitas, mas são o conteúdo.
A-Live

Como você é a resposta aceita, você pode corrigi-la para se tornar a resposta correta (a resposta de ery está correta) ;-)
Christian Fries

Percebi que a ideia do SO é curadoria coletiva, e é por isso que qualquer um pode editar a pergunta de outra pessoa (embora você precise de muitos representantes para pular a revisão da edição).
Andrew Spencer,

117

Copie o conteúdo, incluindo o próprio diretório.

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

Nota: $ {src.dir} é relativo a $ {src.dir.parent}, e não um caminho completo


12
esta deve ser a resposta CORRETA. A outra resposta é para a pergunta "Como você copia o conteúdo de um diretório usando Ant". Existe uma diferença sutil.
cmcginty

"esta deve ser a resposta CORRETA": Com certeza, embora a diferença não seja tão sutil quando você não pode carregar seus recursos com os nomes de caminho esperados.
Jim Pivarski

1
não funciona para o ant 1.8, parece que nada aconteceu.
CCC

8
@CCC garantir que $ {src.dir} seja relativo a $ {src.dir.parent}, e não um caminho completo
Mike Demenok

muito enganador como x.parentNÃO SER o parentde x... -_-
nonchip

25

Você deve apenas especificar o diretório (sem a propriedade includes):

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

Veja o manual para mais detalhes e exemplos.


13
@ s1n Este comando apenas copia todo o conteúdo de src_dir para ../new/dir e não para src_dir. Como copiamos src_dir (diretório) para outro local?
Pipalayan Nayak


2

Um ponto importante: o ant só copiará os subdiretórios se os arquivos de origem forem mais recentes que os arquivos de destino. [1] No meu caso, os sub-dirs não estavam sendo copiados (estou usando verbose = "true"), pois não houve alterações e eles já estavam no destino. Você pode usar "substituir" para forçá-lo ou tocar em alguns dos arquivos em seus sub-diretórios de origem.


2

Eu usei tags include, conforme mostrado no fragmento de código abaixo, em meu arquivo build.xml para copiar arquivos jar individuais dentro de um diretório.

<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

A partir do exemplo aqui , você pode escrever um arquivo Ant simples usando a tarefa de cópia.

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

Isso deve copiar tudo dentro src_dir(excluindo-o) para new/dir.


6
isso é apenas copiar o conteúdo do diretório. não o conteúdo, incluindo o diretamente. :(
ghostCoder

1

Estou adicionando um padrão mais genérico para copiar todas as subpastas.

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

Consulte os padrões para obter detalhes.


1

Outra tarefa da formiga é Copydir . A parte principal aqui é incluir o nome do diretório que você deseja copiar após o diretório dest. Os subdiretórios e arquivos serão copiados automaticamente.

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

Do seu link: Esta tarefa foi descontinuada. Use a tarefa Copiar.
Jim,

0

Este código deve copiar a pasta, bem como seu conteúdo. Ele também usa a tarefa de nome de base para evitar ter que fazer qualquer análise manual de caminho.

<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

Eu finalmente copiei usando o seguinte código

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

Isso copiará a pasta src de dist para o build.

Espero que isso ajude alguém.


ele literalmente diz que copiaria o contrário: P
nonchip de
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.