1つのローカルディレクトリから別のローカルディレクトリに移動する必要がある30GBのディスク容量を占める100万のイメージがあります。
これを行う最も効率的な方法は何でしょうか? mv
? cp
? rsync
?他に何か?
私はこれらを取る必要があります:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
ここに移動します:
/path/to/new/img/dir/
rsync
は、ローカルシステムとリモートシステムの両方に対応する多くのクライアント/サーバーバックグラウンド処理を実行するため、不適切な選択です。
mv
がおそらく最良の選択です。可能であれば、mv directory_old directory_new
のではなく mv directory_old/* directory_new/
。このようにして、100万個ではなく1個のものを移動します。
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/
find -print0
とxargs -0
を使用すると、名前にスペースを使用できます。xargs -r
は、移動するものがなければ、mv
を実行しません。 (mv
は、ソースファイルが指定されていない場合に文句を言います)。mv -t
を使用すると、最初に宛先を指定し、次にxargs
で必要なソースファイルを指定できます。ちなみに、本当に大量のファイルを一度に移動する必要があるのかと自問します。バッチ処理は過大評価されています。出来上がった瞬間に処理できるのであれば、膨大な量の作業を積み重ねないようにしています。
2つのディレクトリが同じファイルシステムにある場合は、ディレクトリの内容ではなく、ディレクトリでmv
を使用します。
2つの異なるファイルシステムに存在する場合は、rsyncを使用します。
rsync -av /source/directory/ /destination
ソースの末尾の/
に注意してください。つまり、ディレクトリ自体ではなく、ディレクトリのコンテンツをコピーします。 /
をオフのままにしても、ファイルはコピーされますが、/destination/directory
という名前のディレクトリに置かれます。 /を使用すると、ファイルは/destination
に配置されます
rsync
は、rootとして実行した場合、またはファイルの所有者である場合に、ファイルの所有権を維持します。また、個々のファイルのmtime
も保持します。
tar cf - dir1 | (cd dir2; tar xf -)
tar cf - dir1 | ssh remote_Host "( cd /path/to/dir2; tar xf - )"
'cp'を使用すると、各ファイルはopen-read-close-open-write-closeを実行します。 Tarは、読み取りと書き込みに複数のプロセスを使用し、同時に複数のファイルを操作する複数のトレッドを使用します。シングルCPUボックスでも、マルチスレッドアプリの方が高速です。
Directory_oldとdirectory_newの両方が同じファイルシステム上にあるため、mv
の代わりにcp -l
をオプションとして使用できます。 cp -l
は、元のファイルへのハードリンクを作成します。 「移動」が完了し、結果に満足したら、これらのファイルをdirectory_oldから削除できます。速度の点では、最初にリンクを作成してから元のリンクを削除するため、「mv」と同じになります。しかし、このアプローチでは、これが理にかなっている場合、最初から始めることができます
空き容量がある場合は、それらを単一の.tarファイルにアーカイブし(圧縮なしの方が高速です)、そのファイルを移動してアーカイブ解除します。
それは依存します(tm)。ファイルシステムがコピーオンライトの場合、コピー(cp
またはrsync
など)はムーブに相当します。ただし、最も一般的なケースでは、移動(mv
)が最も高速です。これは、ファイルが配置されている場所を示すデータの断片を単純に切り替えることができるためです(注:これは過度に単純化されています)。
したがって、平均的なLinuxインストールでは、mv
を使用します。
編集: @FrédéricHamidiのコメントには良い点があります。これは、両方が同じファイルシステムとディスク上にある場合にのみ有効です。それ以外の場合、データはとにかくコピーされます。
宛先の性質により、このタスクを実行する最も効率的な方法が決まります。ローカルシステムを使用しているとしましょう。PWD
は現在/
です。 /a
には数百万の画像が含まれています。私たちの仕事は、すべてのサブディレクトリ構造を維持しながら、すべての画像を/b
に移動することです。また、/a
および/b
が、それぞれローカルに接続されたディスク上の2つの異なるパーティションのマウントポイントであると仮定します。ターピペでこのタスクを実行したいと思います。これには時間がかかる場合があるため、screen
、tmux
を使用しているか、バックグラウンドプロセスとして実行していることを確認してください。
tar -C /a -cf . | tar -C /b -xf -
これにより、/a
のすべてのファイルとディレクトリが/b
にコピーされるため、エラーなしで完了したことを確認したら、/a
をクリーンアップする必要があります。
少なくとも〜10kのファイル(ディレクトリなし)をコピーするために、cpは次のように不平を言いました:
/ bin/cpを実行できません:引数リストが長すぎます
最適なオプションはRsyncです。
rsyncソースターゲット
そして、それは非常に迅速に行われました!