mvを継続するためのベストプラクティス


13

ターミナルを使用して、あるドライブから別のドライブにファイルをコピーしました。

sudo mv -vi /location/to/drive1/ /location/to/drive2/

しかし、ディレクトリを作成した後、数時間、エラーなしで、それは突然停止しました。

それに対する私自身の解決策は、多くの場合、ハッシュと比較の組み合わせです。これは、現在どのファイルが欠落しているかを知らずに中間コピーから回復する必要があるため、ほとんど時間がかかる混乱ですこのスクリプトは、書かれているようにbashでは機能しません):

source_directory="/path/to/source_directory/";
target_directory="/path/to/target_directory/";
while read hash_and_file; do {
    echo "${hash_and_file}" | read hash file;
    echo "${file}" | sed "s/^/${source_directory}/g" | read copy_from;
    echo "${copy_from}" | sed "s/${source_directory}/${target_directory}/g" | read copy_to;
    mv -v "${copy_from}" "${copy_to}" | tee -a log;
    rm -v "${copy_from}" | tee -a log; };
done <<<$(
    comm -23 <( find ${source_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${source_directory}: :g" | sort;
           ) <( find ${target_directory} -type f -exec sha256sum "{}" \; |
                sed "s: ${target_directory}: :g" | sort; ) )

これは、名前ターゲットディレクトリまたはsource_directoryがパスの一部である場合はエラーが発生しやすく、重複としてマークされているために移動されていない場合はファイルを削除します。また、最終的にディレクトリをソースしません。

中断されたMVから回復する方法のベストプラクティスはありますか?


私が書いたようなスクリプト使用し、cmp代わりにハッシュのを。依存関係があり、while readGillesが言及したのと同じ問題があります。また、低速で冗長です。ただし、ファイルは実行中にソースから(再)移動されるため、rsyncメソッドよりも早くディスク領域を解放します。それは勇敢な人のインスピレーションとして役立つかもしれません。
joeytwiddle

3
@joeytwiddle rsyncは--delete-during receiver deletes during the transfer、その他の便利な代替手段も提供しています--delete --delete-before --delete-delay --delete-after --delete-excluded。そのため、はい、rsyncが最良の選択肢です。
Isaac

私は何かが欠けているに違いありません。同じmvコマンドを繰り返すだけでは機能しないのはなぜですか?*元のソースがディレクトリである場合、おそらくソースパスに追加されます。
日本時間

@isaacいいえ、災害にrsync --delete*なるのではないかと心配です!現在にないものを削除するため、前回の試行で正常に移動されたすべてのファイルが削除されます!あなたはおそらく、私が良い選択肢になると思うことを考えていました。(more1more2destsrcrsync --remove-source-files
joeytwiddle

@joeytwiddleいいえrsync --deleteますのみ削除し、他のソースの一部ではないファイルを。[man rsync]()*からdest dirs *から無関係なファイルを削除します。無関係の意味を理解する:同期されていない。はい、rsync は、ソースファイルが正しく送信された後に削除する方法提供します。
アイザック

回答:


46

rsyncを再発明することを忘れて、rsyncを使用してください。

sudo rsync -av /location/to/drive1/ /location/to/drive2/

ソースで末尾のスラッシュを使用していることを確認してください。使用しないと、にコピーされ/location/to/drive2/drive1ます。

コマンドが成功したことを再確認し、実行しrm -rf /location/to/drive1/ます。

上記のコマンドは、からの既存のファイルを上書きしますdrive2。あなたはすでに存在していたファイルをスキップするようにユーザーに入力を求めるプロンプトを表示する場合drive2と同様に、mv -iあなたが今持っていない、既にコピーされているファイルとファイルを区別する必要があるため、それは、より複雑です。--ignore-existingオプションをrsyncに渡して、内容に関係なく宛先にすでに存在するファイルをスキップできます。mvファイルの作成中に元のファイルが中断された場合、このファイルは半分コピーされた状態のままにrsync -aなります(ベアは適切にコピーを終了します)。

mv -iプロンプトを含むの正確な動作を再現したい場合は、実行できますが、はるかに複雑です。

ワンジャイアントライナーは非常に壊れやすいことに注意してください。バックスラッシュまたは改行を含むファイル名がある場合、それらは適切にコピーされないか、スクリプトをtrickして任意のファイルを削除することさえあります。そのため、バックスラッシュや改行を含まないファイル名を信頼できることが確実でない限り、質問でコードを使用しないでください。

将来の参考のためにmv、大規模なクロスドライブの動きには絶対に使用しないことをお勧めします。これは、中断された場合の動作を制御するのが難しいためです。rsyncを使用してコピーを行い、元のファイルを削除します。


rsyncは、mvでできないことを約束しますか?
どのような

4
よく、たとえばrsync、あなたがしようとしていることを行いますが、しmvません。また、異なるマシン間でのコピー。転送のための圧縮; タイムスタンプベースまたはハッシュベースの同等性に基づいて、宛先に存在するファイルをスキップします。所有権、許可、リンク、および特殊ファイルの構成可能な処理。などlinux.die.net/man/1/rsync
Silly Freak

1
@SillyFreakは、Gillesがクロスドライブについて述べたように、mvの代わりに常にrsyncを使用する必要があることを結論付ける必要があります。とにかくrsyncで解決されたでしょうか?

9
1つのパーティション内でファイルまたはディレクトリを移動するときは、ファイルまたはディレクトリmvへの参照を移動するだけなので、通常(またはファイルマネージャ)を使用します。実際のデータ転送を行う必要がある場合rsync、次のいずれかが当てはまる場合に使用します。1)正しい転送を一目で確認できるよりも多くのファイルを移動しています。2)ファイルの同期を維持する必要があると予想しています。3)転送が中断される可能性があります。私のポイントは、あなたが質問で提示しているユースケースのために、rsync単に正しいツールであるmvかどうかcpです。
愚かなフリーク

7
最初に-vおよび—dry-runを指定してrsyncコマンドを常に実行し、実行する内容を正確に確認することをお勧めします。
ダレン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.