web-dev-qa-db-ja.com

Antは上書きせずにファイルをコピーします

Antを使わずにフォルダ構造から別のフォルダ構造にファイルをコピーするコマンドはありますか 最終更新日時の確認 ファイルの上書き。基本的に、フォルダAからフォルダBへのすべての追加ファイルが必要です。つまり、フォルダBのファイルは置き換えられませんが、フォルダAの追加ファイルはフォルダBに移動します

「ant copy」と「ant move」コマンドを見ましたが、助けにはなりませんでした。助言がありますか。

18
user204069

Antのコピータスクの上書き属性には、「コピー先のファイルが新しい場合でも既存のファイルを上書きする」と記載されています。

したがって、falseに設定しても、ファイルが新しい場合は上書きされませんが、元のファイルが新しい場合は、何があっても上書きされます。

これを回避するために見つけた唯一の方法は、コピーする前に宛先ファイルに触れることです。

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

あなたは以下のようにそれを行うことができます:

単一のファイルをコピーする

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

単一のファイルをディレクトリにコピーする

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

ディレクトリを別のディレクトリにコピーする

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

一連のファイルをディレクトリなどにコピーします...

詳細については、このリンクを参照してください。 コピータスク

16
Ali Tofigh

<touch>は機能し、宛先のファイルの日付を更新するため、リクエストに正確には一致しません。

ドキュメントによると、少なくともAnt 1.6.2がある場合は、粒度属性を使用できます。

ファイルが古いと判断するまでの余裕時間(ミリ秒)。すべてのファイルシステムが最後に変更された時刻をミリ秒レベルに追跡できるわけではないため、これが必要になります。デフォルトは1秒、つまりDOSシステムでは2秒です。これは、ソースファイルとターゲットファイルがクロックが同期していない別々のマシンにある場合にも役立ちます。 Ant 1.6.2以降。

大きな値に設定するだけです。私は9223372036854を使用します。これは約292年です(おそらくこれで十分です)。 (私はLong.maxから最後の6桁を切り刻んだだけです)これは将来の日付に関する警告を生成しないのに十分です

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

これは、ファイルが存在する場合、まったく antタスクによって十分に古くないと見なされるため、上書きされない(また、別のタスクによって操作されない)ことを保証します。

7
Beta033

エレガントなソリューションがない場合は、常にシーケンスで実行できます。

  1. <move>フォルダ<B>から<C>
  2. <copy>フォルダーのファイル<A>から<B>
  3. <copy>フォルダーのファイル<C>から<B>を使用してoverwrite=true

(逆のことを行い、古いファイルではなく新しいファイルを置き換えます)

3

問題の簡単な解決策は、copyコマンドに上書きパラメーターを使用することです。これにより、ファイルが置き換えられないことが保証されます

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

この例では、presentセレクターを使用して、ファイルがターゲットディレクトリに存在しないことを選択しました(機能的には、上書きチェックと同じです)。 date条件を追加して、特定の日付以降にファイルが変更されているかどうかをテストしました。

selector リストは非常に広範囲です。

2
Mark O'Connor

<copy>タグとファイルセット**/*およびoverwrite属性を明示的にfalseに設定します。私はいつもこれを使います:

<copy todir="/your/target" overwrite="false">
  <fileset dir="/your/source" />
</copy>
2
Joeri Hendrickx