【问题标题】:Ant - copy only file not directoryAnt - 只复制文件而不是目录
【发布时间】:2009-10-14 07:26:08
【问题描述】:

我需要使用 Ant 脚本复制文件夹中除该文件夹中的目录之外的所有文件。

我正在使用下面的脚本来做到这一点。

<copy todir="targetsir">
  <fileset dir="srcdir">
     <include name="**/*.*"/>
  </fileset>
</copy>

但它会复制该文件夹中的所有文件和目录。

如何限制/过滤该文件夹中的目录?

谢谢,

【问题讨论】:

    标签: ant


    【解决方案1】:

    我认为有一个更简单的方法。

    flatten="true" - 忽略源目录的目录结构,将所有文件复制到由 todir 属性指定的单个目录中。默认为false

    【讨论】:

    • 这个问题很难用语言表达。你的答案就在盯着我看的蚂蚁页面上。非常感谢!
    【解决方案2】:

    您的意思是srcdir 包含子目录,而您不想复制它们,只想复制srcdir 下一级的文件?

    <copy todir="targetsir">
      <fileset dir="srcdir">
         <include name="*"/>
         <type type="file"/>
      </fileset>
    </copy>
    

    应该可以。您问题中的“**/*.*”表示“每个子目录下的每个文件”。仅使用“*”只会匹配 srcdir 下的文件,而不是子目录。

    已编辑以排除创建空子目录。

    【讨论】:

    • * 本身会创建空的子目录。我不认为这是预期的行为。我认为下面@Pavel 的解决方案是正确的。
    【解决方案3】:

    我没有足够的声誉来发表评论,所以我在这里写新帖子。包含name="*"name="*.*" 的两种解决方案通常都可以正常工作,但它们都不是您所期望的。

    第一个创建源目录中存在的空目录,因为* 也与目录名称匹配。 *.* 之所以起作用,主要是因为文件有扩展名而目录没有的约定,但是如果您将目录命名为 my.dir,此通配符也会创建一个具有此名称的空目录。

    要正确执行此操作,您可以利用 &lt;fileset /&gt; 接受的 &lt;type /&gt; 选择器:

    <copy todir="targetsir"> 
      <fileset dir="srcdir"> 
         <include name="*"/> 
         <type type="file"/>
      </fileset> 
    </copy>
    

    【讨论】:

      【解决方案4】:

      你可以试试

      <copy todir="targetsir"> 
        <fileset dir="srcdir"> 
           <include name="*.*"/> 
        </fileset> 
      </copy> 
      

      ** 用于匹配目录结构。

      【讨论】:

        【解决方案5】:
        <copy todir="targetsir" includeEmptyDirs="false"> 
          <fileset dir="srcdir"> 
             <include name="*"/> 
          </fileset> 
        </copy>
        

        【讨论】:

          【解决方案6】:

          如果您的文件夹有很多子目录并且您不希望它们被复制(如果您只想要文件)试试这个..

          <target name="copy">
          <copy todir="out" flatten="true">
          <fileset dir="tn">
          <filename name="**/cit.txt" />
          </fileset>
          </copy>
          </target>
          

          【讨论】:

          • 默认扁平化设置为“false”
          【解决方案7】:

          秘诀是不要使用文件集,而是使用目录集。

          【讨论】:

          • 我怀疑你在这里的意思更明确会是有益的