2017-10-11 12 views
0

私は、さまざまな製品の複数のインストーラにバンドルされる数千のバイナリを含むフォルダを生成するスクリプトを作成しています。スクリプトの大部分は、さまざまな任意の場所から一時的なパスにファイルを "コピー"して、インストーラ/ tarballの望ましい出力構造を生成します。大規模なハードリンクループのアクセラレーション/パラレル化

この操作の最も遅い単一の部分は次のように本質的に見える巨大なループです:これが行われている理由は、それが目的の場所にに「コピー」のファイルへのより高速な方法であるということである

for i in $(find /some/tmp/path -iname "*") 
do 
    ln "${i}" "/TEMP1/${i}" 
done 

最終出力tarballを生成し、ファイルの実際のコピーと同じだけのディスク領域を使用しません。

しかし、このループは非常に遅いです(30,000ファイルをハードリンクするのに約15分かかります)。これがトップエンドのSSDを備えた非常に強力なマシン上で実行されていると仮定すると、これはparallelタイプのツールでラップするか、lnのすべての操作をバックグラウンドでバックグラウンドすることで大幅に高速化できるタスクでしょうか?PIDln操作の場合は、最後にすべてのプロセスが正常に終了したかどうかを確認します。あるいは、これをスピードアップするための他の手段がありますか?

答えて

1

これはトリックを行う必要があります。

for i in $(find /some/tmp/path -iname "*") 
do 
    ln "${i}" "/TEMP1/${i}" & 
done 
wait 

私はそれが動作するかどうか教えてください。 よろしく!

+1

Worked great。また、驚くほど速く** GNU並列を使用するよりも高速**でした。 – DevNull

+0

@DevNullその仲間を聞いてうれしい! –

関連する問題