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?

Sunil Kumar Sahoo
fonte
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)

Onipresente
fonte
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

ery
fonte
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.

s1n
fonte
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
14

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

<copy todir="${dest.dir}" >  
  <fileset dir="${src.dir.parent}" includes="${src.dir}/**"/>
</copy>
cmcginty
fonte
2
Esta é a opção mais sucinta. Consulte também ant.apache.org/manual/Types/fileset.html .
Jess,
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.

Jess
fonte
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>
Raman B
fonte
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.

NawaMan
fonte
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.

Sartoris
fonte
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>
Andrei
fonte
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>
user506069
fonte
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.

Dilip Rajkumar
fonte
ele literalmente diz que copiaria o contrário: P
nonchip de