1

マップされたネットワーク ディレクトリにある最新のファイルをコピーしたいと考えています。${drive.letter}を使用してネットワーク ディレクトリが既にマップされていNET USEます。

<copy todir="${dest.dir}" overwrite="true">
    <first>
        <sort>
            <fileset dir="${drive.letter}\">
                <filename name="FileIWant-*.tar.gz" />
            </fileset>
            <date xmlns="antlib:org.apache.tools.ant.types.resources.comparators"/>
        </sort>
    </first>
</copy>

このタスクが完了するまでに信じられないほど長い時間がかかります。なぜそんなに時間がかかるのか、またスピードアップできるかどうか疑問に思っています。ネットワーク ディレクトリには 20,000 個以上のファイルがあります。ソート タスクが最初に実行され、次にファイルセット セレクターが実行されますか? それとも、ネットワーク経由なので、しばらく時間がかかりますか?

FileIWant-*.tar.gzすべてのファイルをローカルにコピーしてソートを実行することが考えられる他の唯一の解決策ですが、コピーによってタイムスタンプが変更されるかどうかはわかりません。

4

2 に答える 2

0

UNIX を使用している場合は、1 行のコマンド ラインでこれを行うために使用すると思います。ls/find、sort、および head を使用すると、これをワンライナーにすることができます。これには、多くの余分な作業がなく (Ant はファイルセットを構築し、ネットワーク経由で一度に多くのことを行うのに忙しい)、OS に最適化させるという利点があります。

次に、Windowsでそれを行う方法を検索したところ、この1つのライナーが見つかりました。同じ考えです。OSレベルでやったほうが早いと思います。(ただし、ファイルをローカルに置くほど高速ではありません。)

もう 1 つの方法は、dir を実行し、その結果を解析/ソートすることです。実行時にファイルをローカルにコピーする必要がある場合、ファイルをローカルにコピーする方が高速になるとは想像できません。

于 2012-06-29T20:21:16.603 に答える
0

私はこれを行うためのバットスクリプトを作成しました。これははるかに高速であり、Antスクリプトから呼び出すだけです。

echo Logging on to Server
net use %NetworkDir% 
if not errorlevel 0 goto error

pushd  %NetworkDir%
for /f "tokens=*" %%A in ('dir %FileIWant% /b /o:D') do (set sourceFile=%%A)
echo Copying %%A...
xcopy /V/F/Z/Y "%sourcefile%" "%copyTo%"
popd
于 2012-07-02T18:08:40.737 に答える