端末を使用して、あるドライブから別のドライブにファイルをコピーします。
sudo mv -vi /location/to/drive1/ /location/to/drive2/
ところで、ディレクトリを作成してから数時間経ってもエラーなく突然停止してしまいました。
私の解決策は通常ハッシュと比較が混在していますが、実際にはどのファイルが見つからないのかを知らずに中間コピーから復元する必要があるため、ほとんど時間がかかります(zshに対して非常に長い行で書かれています)。このスクリプトは(作成したとおり)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; ) )
targetディレクトリまたはsource_directoryという名前がパスの一部である場合は間違っている可能性があり、重複してマークされて移動されていないファイルを削除するだけです。また、ソースディレクトリがなくなります。
中断されたMVを回復する方法のベストプラクティスはありますか?
答え1
rsyncを再発明しようとすることを忘れて、代わりにrsyncを使用してください。
sudo rsync -av /location/to/drive1/ /location/to/drive2/
ソースファイルで末尾のスラッシュを使用する必要があります。それ以外の場合/location/to/drive2/drive1
。
コマンドを実行する前に、コマンドが成功したことを再確認してくださいrm -rf /location/to/drive1/
。
上記のコマンドはを上書きします。たとえば、drive2
既に存在するファイルをスキップするようにユーザーにメッセージを表示したい場合は、コピーされたファイルとまだコピーされていないファイルを区別する必要があるため、より複雑になります。このオプションをrsyncに渡して、コンテンツに関係なく、ターゲットにすでに存在するファイルをスキップできます。ファイルの作成中に元のファイルが中断されると、ファイルは半コピーされたままになります(一方、ベアファイルはコピーを正しく完了します)。drive2
mv -i
--ignore-existing
mv
rsync -a
プロンプトを含む正確な動作を再現したい場合は、これを行うことができますが、mv -i
はるかに複雑です。
ユニコーンの裏地は非常に弱いことに注意してください。ファイル名にバックスラッシュや改行文字が含まれていると、正しくコピーされず、スクリプトをだまして任意のファイルを削除することもできます。だから質問にコードを使用しないでくださいファイル名にバックスラッシュや改行文字が含まれていないことがわからない場合。
後で参照できるように、大規模なクロスドライブの移動には絶対に使用しないことをお勧めします。mv
中断するとどうなるかをコントロールするのが難しいからです。 rsyncを使用して元のファイルをコピーして削除します。