web-dev-qa-db-ja.com

同じサーバー上の2つのWindowsファイル共有間でファイルを移動する

Windows 7を使用して、共有フォルダーがセットアップされたサーバーがあります。それらの1つを開いてファイルを取得し、それをサブフォルダーに移動すると、すぐに実行されます。ファイルは明らかにサーバー上でのみ移動されます。同じ共有フォルダを開いている2つのウィンドウについても同じです。

一方、同じサーバー上の別の共有フォルダーを開いてファイルをそれらの間で移動すると、ファイルを最初の共有から一時フォルダー内のコンピューターにダウンロードしてから、他の共有にアップロードするなど、非常に長い時間がかかります。 。

コンピューターがファイルをダウンロードせずに、このように異なる共有間でファイルを移動する方法はありますか?多くの場合、非常に大きなファイルであるため、速度が必要です。

4
olofom

「別の共有フォルダ」とは、「別のファイル共有(つまり、別のマップされたドライブ)内のフォルダ」を意味しますか?もしそうなら、それが問題であり、簡単で魔法の修正はありません。 移動ファイルをあるフォルダから別のフォルダに同じボリューム上の場合、必要なのは、オペレーティングシステムが宛先フォルダに新しいディレクトリエントリを書き込み、ソースフォルダの古いディレクトリエントリを消去します—ファイルデータにアクセスする必要はありません。 copyファイルの場合、OSは各データブロックを読み取り、新しい場所に書き込む必要があります。また、ボリューム間の移動は、物理的に離れたディスク間の移動である可能性もあります。ディレクトリエントリは別のボリューム上のデータブロックを指すことができないため、コピーとして処理した後、ソースファイルを削除する必要があります。

P.S.皮肉なことに、物理的に離れたディスク間の移動は、同じディスク上のパーティション(ボリュームまたは「共有」)間の移動よりも速いである可能性があります。後者の場合、ディスクI/Oヘッドがジャンプする必要があるためです。ソースシリンダーとデスティネーションシリンダーの間を行ったり来たりします。

2
Scott

私はごちそうに遅れていますが、それでも、ここにレシピがあり、それはいくつかの前提条件を備えた実用的な方法だと思います。

  • コアアイデアは、特定の場所(もちろん1つのSamba共有にある)にあるオブジェクトを別の場所(もちろん-にある)に移動するようにサーバーに指示しています。 別の Samba共有)。

  • inotifywaitはシェフであり、料理人はwhileread、およびmvと呼ばれます。それが私たちの夕食のチームです。

  • そして、キッチン(ま​​たはおそらくダイニングルーム)は次のようになります:

Samba shares ├─share.1 │ ├─recv │ ├─to.share.2 │ ├─to.share.3 │ └─[...] ├─share.2 │ ├─recv │ ├─to.share.1 │ ├─to.share.3 │ └─[...] ├─share.3 │ ├─recv │ ├─to.share.1 │ ├─to.share.2 │ └─[...] └─[...]

たとえば、share.xへのユーザーログイン。ユーザーがshare.x内の何かをshare.yに移動/コピーしたい場合は、次の操作を行います。

  1. Share.x内のオブジェクトを選択し、それらをshare.x/to.share.yに移動/コピーします。

  2. サーバーは、これらのto.share.*フォルダーをinotifywaitで監視しているため、作業の時間であることがわかります。

  3. サーバーは、share.x/to.share.y内のオブジェクトをshare.y/recvに移動します。

  4. 完了!

前提条件には、上記の特定のフォルダー構造、実際のmv操作を実行するためにサーバー上で実行されるジョブ/サービス/スクリプトが含まれます。

私はあなたと共有するための独自のスクリプトコードを持っていますが、行うべき多くの改善があります:

inotifywait -m "$source_dir" --format '%w%f' -e moved_to,create,modify | while read file; do mv -v "$file" "$dest_dir"; done

これらの$source_dir$dest_dirを自分のニーズに合うように変更します。

私はsupervisorを使用して、上記のような一連のスクリプトを管理し、「Sambaテレポーテーション」を作成します。 supervisorに慣れていない場合は、 http://supervisord.org/ およびその他の回答を参照してください。

2
mo-han

最も簡単/迅速で汚い方法は、サーバー自体からそれを行うか、サブフォルダーとして両方のターゲット共有を持つ共有を作成することです(例:\\servername\c$)。

1
daniel