大量のファイルを移動する(〜100 000)


13

フォルダーごとに100,000個、または1,000,000個のファイルなど、多くのファイルを含むフォルダーを操作します。フォルダーのコンテンツを別のフォルダーに移動しようとすると、コンピューターが常に動かなくなります。プロセスが終了したように見えても、nautilusが完全にフリーズしているように見え、コンピューターを強制的に再起動する必要があるため、フォルダーの内容を見ることができません。これは、10,000個のファイルのように移動しようとしたときにも発生することに気付きました。

これは私のコンピューターの問題ですか、それともこれらの番号を操作するときに正常ですか?

このファイル転送を実行するスマートな方法はありますか?


3
端末の使用について(cp -R SRC/ DEST/
UniversallyUniqueID

2
@BharadwajRaju:ファイルによっては、cp -aの方が所有者、タイムスタンプ、およびアクセス許可を保持するため、より良い可能性があります。また、転送を検証し、まだ存在しないファイルのみをコピーできるため、rsyncもお勧めします。
マイケル

更新:(パッケージgvfs-copyからgvfs-bin)はよりも高速になる可能性がありますcp
UniversallyUniqueID

ここには1つではなく2つの質問があります。手順については、質問方法ページご覧ください。
ルイスデスーサ

回答:


19

おそらく、非常に大量のファイルを転送するために純粋なコマンドラインメソッドを使用することを検討してください。GUIを使用するよりもプロセスが大幅に高速であることは間違いありません。

これを実現するにはさまざまな方法がありますが、私のシステムでは以下が迅速、安全、効率的に機能しました。

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

このコマンドの説明:

  1. 入力ディレクトリは「。」です この特定のコマンドでは、そのディレクトリにいる必要があります
  2. 出力ディレクトリは<destination>私の例です。明らかに、これを自分のニーズに合わせて変更し、括弧は省略します。
  3. この構文は、ボーナスとしてスペースを含むファイル名を許可します:)

無限の順列が可能ですが、これはGUI よりもうまく機能し、はるかに効率的です。たとえば、1つの順列:pdfファイルのみを移動する場合は、次を実行できます。

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

を使用するxargsと、特にこのような多数のファイルの移動で多くの可能性が開きます。たくさんの可能性....

潜在的な問題:

これらの考えに対する以下のコメンターのおかげで、熟考するために少なくとも2つの潜在的な落とし穴があります:

  1. 宛先ディレクトリが破損している可能性があり、その後に到達できない場所にあるか、入力ミスなどmvにより、ファイルがそこに移動します!ここで注意してください...
  2. もし-tオプション(--target-directory)不足しているとコピー先のフォルダは、実際に使用すると、1つのファイルを移動し、残りの部分に失敗したファイルです。mv2つの用途があります。ソースの名前を宛先に変更するか、ソースをディレクトリに移動します。再び注意してください...

2
ただしませfind . -maxdepth 1 -type f -exec mv -t test {} +んか?
ムル

@muru:そのおかげで、私は余分な-name...部分を削除しましたが、そのまま残しxargsています。
andrew.46

2
わからない...コマンドは明らかに正しいですが、完全な移動は少しエラーが発生しやすいと考えます。(あなたは、例えば、含めることを忘れたらどう-tフラグを?私は、すべてのファイルと呼ばれる1つのファイルに「移動」することだと思うtestものを除くすべてのファイルが失われ、。)私は私が好むだろうと思うrsyncが続き、すべては、なくなっ権利を持っている場合 rm。ただし、このようなチェックを自動化できないシナリオは想像できます。
ジョス

@Jos:ありがとう、この可能性を説明するフッターを追加しました。rsync 回答として書かれた例を見るといいですか?
andrew.46

あなたはおそらく行うことができますので、Linuxは、非常に長い引数リストをサポートしているmv dir1/* dir2、とだけに頼らfind -exec問題がある場合、または、あなたのグロブでのフォルダにマッチするのを避けるために必要がある場合。(お使いの命名規則に依存しますが、多くの場合、*.*それの一般的なものは持っているので、ほとんどのファイルではなく、ほとんどのディレクトリにマッチします.extensionファイルに、そして一般的なのは持っていない.ディレクトリ名での)
ピーター・コルド

4

以前にも同様の経験がありましたが、多数のファイルを扱う場合は正常です。私はPDFデータシート(電子部品)の大規模なコレクションを持っていました。

GUIツールは、いくつかのファイルの詳細とメタデータ(アイコン/サムネイル、サイズなど)をチェックします。そのような場合、それは大したことになるでしょう。でも中にアイコン表示、それらのほとんどは、このような極端なケースのために設計されていないとし、サムネイルずに、彼らがフリーズします。GUIツールは、ディレクトリ内のすべてのファイル/フォルダーのプレゼンテーションアイコンをロードしようとしますが、これらのアイテムは現在の画面部分ではユーザーに表示されません。ソートも問題の一部であり、それを回避する方法はありません。

  • 最終的には、ブランド/モデルに基づいてそれぞれ10000未満の個別のフォルダーにファイルファイルを分割します。日付(ほとんどの人が写真/スキャンで行うように)または最初の文字(Ubuntuパッケージリポジトリのように)を使用できます
  • 代わりにCLIツールを使用する方が簡単です。要求されたものだけが表示されるからです。のlocate代わりにクイック検索に使用できますfind
  • 移動操作の場合mv、ターミナルで使用します(GUIツールは、ビューを定期的に更新しようとするため低速です)。

    同じパーティションにある場合、コマンドはファイルシステムインデックス内のポインタのみを変更します。そうでない場合は、二重操作(コピーと削除)になります。それは高価になります。

これらのファイルを複数回コピーし、更新されない場合、私が助けることができるケースは1つだけです。コレクションを友人と共有したときと同じように、コピーしようとするたびに10年かかります。(これは小さなサイズのファイルでのみより便利です)

  • 圧縮なし/低圧縮のzipなど、単一のパッケージまたはいくつかのパッケージを作成します。コピーすると高速になりますので、DMAに任せてください。

3

GUIの感覚と柔軟性を組み合わせたコマンドライン操作の利点を提供するソリューションを探しているなら、私はmcmidnight commander)をお勧めします。

mc司令官2ペインビュー

これは、ncursesベースの視覚的なファイルマネージャです。ファイルの2ペインビューとメニューを使用できます。マウスの使用は、sshを介しても可能です。fsをブラウズし、ファイルビューアでファイルを検査し、その場で条件に従ってフィルタリングし、コマンドラインでコピーまたは移動操作を実行できます。

80年代半ばに人気があったDOSプログラムNortonの司令官のクローンです。GUIが私にとって信頼できなくなり、あなたの目的にとって理想的であるときはいつでもうまくいきます。


0

似たような問題に遭遇しました-RAIDセットアップをテストしていて、巨大な転送(たとえば、100,000 +ファイルと1-2 TBのデータを一度に実行する)を行うと、転送がかなり高速に開始されるようです-たとえば、〜200MB /秒、その後、(おそらくドライブのフラッシュキャッシュストレージを消費した後)約90〜120 MB /秒の適切なプラトーにすばやく減速します。その後、20〜30分後、操作は徐々に30〜40 MB /秒という非常に低いプラトーに低下し始め、小さなファイルを処理する場合はさらに悪化します。4〜5時間の操作を15時間に近づけます。

ドライブの故障の可能性など、診断に時間を費やしました。さまざまなツール(コマンドライン、nautilus)を試しましたが、非常に大規模なコピー操作に対して適切なスループットを維持できませんでした。

私にとって最適なのは、真夜中の司令官を使用することであり、コピーが遅くなるたびに、保留中の操作がフラッシュされた後、ハードドライブのライトが消えるまで操作を一時停止します-通常は1分程度-その後、MCの一時停止を解除し、さらに20〜30分間、適切なペースで回復します。むしろ迷惑です。

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