Linuxで1つのディレクトリから別のディレクトリに100万のイメージを移動する最も速い方法は何ですか?


14

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/

5
mvソースとターゲットの両方のディレクトリが同じファイルシステムにある場合、パフォーマンスの点で優れているとは思いません。
フレデリックハミディ2012年

回答:


26

rsync ローカルシステムとリモートシステムの両方に対応する多くのクライアント/サーバーバックグラウンド処理を行うため、これは適切な選択ではありません。

mvおそらく最良の選択です。可能であれば、mv directory_old directory_newではなく試してくださいmv directory_old/* directory_new/。このようにして、100万個ではなく1個のものを移動します。


6
ファイルの代わりにディレクトリを移動するようアドバイスするための+1。
Ex Umbris、2012年

4
さらに、ワイルドカード拡張はmv、数百万について話している場合にサポートされる最大の引数を壊す可能性があります。
slhck

6
rsyncはローカルストレージメディア上の転送をうまく処理します。--whole-file(delta xferアルゴリズムの実装を削除する)などを強制し、ローカル転送では役に立たない--compressionなどの他のものを防止します。ディレクトリが異なるファイルシステムにある場合、「mv」はいかなる種類のパフォーマンスも提供しません。それらが同じファイルシステムに存在する場合、これらの人々が言っ​​たようにディレクトリを「mv」するだけです。
UtahJarhead 2012年

多くの画像がある場合、単純なシェルワイルドカードを使用すると、最大のコマンドラインでオーバーフローします。
ラウル・サリナス- Monteagudo

1
ディスク間を移動しても、すべてのデータが移動されます。同じディスク上で、mviノード情報を更新するだけなので、mv directory_old directory_newより速く動作しますmv directory_old/* directory_new
Anshul

14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • これは引数の展開をオーバーフローしません。
  • 必要に応じて、ファイル拡張子を指定できます。(-名前 ...)
  • find -print0with xargs -0では、名前にスペースを使用できます。
  • xargs -r移動するものがmvなければ実行されません。(mvソースファイルが与えられないと文句を言うでしょう)。
  • この構文でmv -tは、最初に宛先を指定し、次にで必要なソースファイルを指定できますxargs
  • ディレクトリに含まれるファイルの数に関係なく一定の時間内に行われるため、ディレクトリ全体の移動はもちろんはるかに高速ですが、
    • ソースディレクトリが少しの間消え、問題が発生する可能性があります。
    • プロセスが現在のディレクトリを出力ディレクトリとして使用している場合(常に移動しない場所からの絶対パスを参照するのとは対照的)、それを再起動する必要があります。(ログローテーションで行うように)。

ちなみに、本当に大量のファイルを一度に移動する必要があるのか​​と自問します。バッチ処理は過大評価されています。出来上がった瞬間に処理できるのであれば、膨大な量の作業を積み重ねないようにしています。


これは、同じサーバー上のファイルシステム間でファイルを移動するのに十分機能します。rsyncで解決策を探す気にならなかったので十分です。確かに1、2時間かかりましたが、うまくいきます。"。"の代わりにディレクトリ名を指定すると、注意してください。-findコマンドでは必ず末尾にスラッシュを使用してください。スラッシュを使用しないと、mvコマンドの宛先にディレクトリが再作成されます。
Speeddymon 2017

7

2つのディレクトリが同じファイルシステムにある場合mvは、ディレクトリのコンテンツではなく、ディレクトリで使用します。

2つの異なるファイルシステムにある場合は、rsyncを使用します。

rsync -av /source/directory/ /destination

/ソースの末尾に注意してください。つまり、ディレクトリ自体ではなく、ディレクトリのコンテンツをコピーします。/オフのままにしても、ファイルはコピーされますが、という名前のディレクトリに置かれ/destination/directoryます。/を使用すると、ファイルは/destination

rsyncルートとして実行した場合、またはファイルの所有者である場合は、ファイルの所有権を維持します。また、mtime個々のファイルのを維持します。


2
大きなフォルダを1つのハードドライブから別のハードドライブにコピーする場合、rsyncは周りを回るようmvです。先端をありがとう!
leo-the-manic

2
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ボックスでも、マルチスレッドアプリの方が高速です。


2
これで質問に答えることができるかもしれませんが、なぜそうするのかについての説明を提供できれば、より良い答えになります。
DavidPostill

1
ローカルマシンにある場合は、同じファイルシステムにある可能性があります。を使用tar c | tar xすると、O(file_count)の代わりにO(total_size)のコストが発生します。
ラウル・サリナス- Monteagudo

1

directory_oldとdirectory_newの両方が同じファイルシステム上cp -lにあるmvため、オプションとしてではなく使用できます。cp -l元のファイルへのハードリンクを作成します。「移動」が完了し、結果に満足したら、これらのファイルをdirectory_oldから削除できます。速度の点では、最初にリンクを作成してから元のリンクを削除するため、「mv」と同じになります。しかし、このアプローチでは、これが理にかなっている場合、最初から始めることができます


0

それは依存します(tm)。ファイルシステムがコピーオンライトの場合、コピー(cpまたはrsyncなど)はムーブに相当するはずです。しかし、ほとんどの一般的なケースでは、移動(mv)が最速になります。移動()は、ファイルの配置場所を示すデータの断片を切り替えるだけなので(注:これは過度に単純化されています)。

だから、あなたの平均的なLinuxインストールでは、私は行くでしょうmv

編集: @FrédéricHamidiはコメントで良い点を持っています:これは、両方が同じファイルシステムとディスク上にある場合にのみ有効です。それ以外の場合、データはとにかくコピーされます。


0

少なくとも〜10kのファイル(ディレクトリなし)をコピーするために、cpは次のように不平を言いました:

/ bin / cpを実行できません:引数リストが長すぎます

最適なオプションはRsyncです。

rsyncソースターゲット

そして、それは非常に迅速に行われました!


0

空き容量がある場合は、それらを単一の.tarファイルにアーカイブし(圧縮なしの方が高速です)、そのファイルを移動してアーカイブ解除します。


0

宛先の性質により、このタスクを実行する最も効率的な方法が決まります。あなたがローカルシステム上にいると仮定しましょう、あなたPWD/今です。そして/a、画像の何百万人が含まれています。私たちの仕事は/b、すべてのサブディレクトリ構造を維持しながら、すべての画像をに移動することです。また、それぞれがローカルに接続されたディスク上の2つの異なるパーティションのマウントポイントであると仮定/a/bます。ターピペでこのタスクを実行したいと思います。これには多少時間がかかる場合がありますので、必ず使用している作るscreentmuxまたはあなたは、バックグラウンド・プロセスとしてこれを実行します。

tar -C /a -cf . | tar -C /b -xf -

これにより、すべてのファイルとディレクトリがにコピーされる/aため/b/aエラーなしで完了したことを確認したら、クリーンアップする必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.