2010-08-17 159 views
16

螞蟻有任何命令將文件從一個文件夾結構複製到另一個沒有檢查上次修改日期/時間覆蓋文件。基本上我想從文件夾A到文件夾B的所有額外文件。即:文件夾B的任何文件都被替換,但文件夾A的額外文件來到文件夾B螞蟻複製文件

我看到「ant copy」和「ant move」命令,但沒有幫助。有什麼建議麼。

+3

你試過用overwrite =「true」來使用ant copy嗎? – 2010-08-17 13:38:42

+0

請問爲什麼你添加了maven-2標籤?你在談論嵌入maven的螞蟻嗎? – 2010-08-17 13:50:59

+0

大多數使用maven的人都來自螞蟻背景,除此之外你是對的,我總是可以在螞蟻中嵌入maven。 – user204069 2010-08-17 14:06:15

回答

3

如果沒有一個很好的解決方案,你總是可以做一個序列:

  1. <move>文件夾<A><B><C>
  2. <copy>文件夾<C><B>
  3. <copy>文件到<B>使用overwrite=true

(做事的其他方式,取代了新的文件,而不是舊的)

+0

這沒有幫助,因爲即使將文件備份到文件夾C中,上次修改日期時間仍保持不變。 – user204069 2010-08-17 14:48:56

+0

因此,在步驟3期間,由於文件夾B(從文件夾A複製)文件被修改文件夾C,所以問題保持不變。 – user204069 2010-08-17 14:51:16

+0

不,如果在步驟3中使用overwrite = true。 – 2010-08-17 15:07:02

2

只需使用<copy>標籤與文件集**/*和覆蓋屬性明確設置爲false。我一直都在使用它:

<copy todir="/your/target" overwrite="false"> 
    <fileset dir="/your/source" /> 
</copy> 
+0

inculde'**/*'是多餘的。這就是''默認做的。 – 2010-08-18 16:41:45

+0

這是overwrite =「false」標誌,確保文件不被複制兩次 – 2010-08-18 19:07:20

+2

這是錯誤的。覆蓋默認爲false,上面的內容其實就是複製的默認設置。 overwrite =「false」表示如果目標文件較新,則不覆蓋,如果目標文件較舊,則它總是覆蓋。 – Thor84no 2011-12-08 11:17:25

2

問題的簡單解決方案是使用覆蓋參數複製命令。這將確保文件不會被替換

<copy todir="B" verbose="true" overwrite="false"> 
     <fileset dir="A"/> 
    </copy> 

更復雜的例子是使用文件集selector

<copy todir="B" verbose="true"> 
     <fileset dir="A"> 
      <present targetdir="B" present="srconly"/> 
      <date datetime="01/01/2001 12:00 AM" when="after"/> 
     </fileset> 
    </copy> 

在這個例子中,我使用了目前選擇器選擇一個文件ISN」 (在功能上與覆蓋檢查相同),並且我添加了額外的日期條件以測試自某個日期以來文件是否已被修改。

selector列表相當廣泛。

17

Ant的複製任務的覆蓋屬性狀態: 「即使目標文件較新,也覆蓋現有文件」。

因此,將其設置爲false只會防止它們被覆蓋,如果它們較新,但如果原始文件較新,則無論如何覆蓋它們。

我找到解決這個問題的唯一方法是複製前觸及目標文件,即:

<touch> 
    <fileset dir="${dest.dir}"/> 
</touch> 
<copy todir="${dest.dir}" overwrite="false"> 
    <fileset dir="${src.dir}"/> 
</copy> 
5

雖然<touch>作品,它會更新文件日期中的目的地,因此它是不完全符合要求。

根據文檔如果您至少有Ant 1.6.2,則可以使用粒度屬性。

在決定文件之前給出的毫秒數是 過期。這是必需的,因爲不是每個文件系統都支持 跟蹤上次修改時間到毫秒級別。 DOS系統上的默認值爲1秒鐘,即2秒鐘,即2秒鐘。如果源 和目標文件位於不同的計算機上,且時鐘超出 同步,則此功能也可能非常有用。自從Ant 1.6.2以來。

只是將它設置爲一個很大的數字。我使用9223372036854,這應該是大約292年(可能這已經足夠了)。 (我只是切碎後6位斷Long.max),這是夠不產生有關日期在未來是

<copy todir="${dest.dir}" overwrite="false" granularity="9223372036854"> 
    <fileset dir="${src.dir}"/> 
</copy> 

這將保證文件是否存在在所有他們將看到警告因爲沒有螞蟻的任務,因此足夠大,不會被覆蓋(也沒有被其他任務感動)

+0

優秀的解決方案。 – 2015-12-28 19:39:25

13

你可以做如下:

複製一個文件

<copy file="myfile.txt" tofile="mycopy.txt"/> 

複製一個文件到一個目錄

<copy file="myfile.txt" todir="../some/other/dir"/> 

複製一個目錄到另一個目錄

<拷貝todir = 「../新/目錄 」> <文件集DIR =「 src_dir」/ > < /複製>

複製的一組文件的目錄和更多...

請參閱此鏈接瞭解更多信息。 Copy Task

+0

如何重命名文件? – 2015-07-31 20:15:14

+0

將文件foo.jar重命名爲$ {name} - $ {version} .jar(假設名稱和版本是預定義的屬性)。 如果一個名爲$ {name} - $ {version} .jar的文件已經存在,它將被刪除在重命名foo.jar之前。 – 2015-08-02 03:54:17

+0

非常感謝。現在任務已過時,我可以使用任務完成重命名。 – 2015-08-02 04:56:48