49 GBのディレクトリを間違ったファイルパスで「mv」しました。ファイルを元の状態に復元できますか?

49 GBのディレクトリを間違ったファイルパスで「mv」しました。ファイルを元の状態に復元できますか?

私(まあ、私は持つ)目次:

/media/admin/my_data

サイズは約49GBで、数万のファイルが含まれています。このディレクトリは、アクティブなLUKSパーティションのマウントポイントです。

ディレクトリ名を次のように変更したいと思います。

/media/admin/my_data_on_60GB_partition

当時は気付いていませんでしたが、ホームディレクトリでコマンドを実行していたので、結局、次のようになりました。

~% sudo mv /media/admin/my_data my_data_on_60GB_partition

その後、プログラムは内容を新しいディレクトリに移動mvし始めます。/media/admin/my_data~/my_data_on_60GB_partition

Ctrl+を使用してCコマンドをキャンセルしたので、複数のファイルが複数のディレクトリに分割されています。

~/my_data_on_60GB_partition    <---  about 2GB worth files in here

そして

/media/admin/my_data           <---- about 47GB of orig files in here    

新しいディレクトリ~/my_data_on_60GB_partitionと一部のサブディレクトリはルートが所有しています。私はプログラムが最初にファイルをルートにコピーし、転送後に自分のユーザーアカウントに返す必要があると
仮定します。mvchown

やや古いディレクトリ/パーティションのバックアップがあります。
私の質問は、移動した複数のファイルを確実に回復できますか?

つまり、次のことを実行できます。

sudo mv ~/my_data_on_60GB_partition/*  /media/admin/my_data

または、ファイルが破損しているか部分的に破損している可能性があるため、回復の試みを放棄する必要がありますか?

  • オペレーティングシステム - Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

答え1

ファイルシステム間でファイルを移動すると、mvファイルはコピーが完了するまで削除されず、ファイルを順次処理します。 (もともと各ファイルを順次コピーして削除することを言いましたが、保証されません。少なくともGNUmvコピーは削除されます。ファイルごと)コマンドラインパラメータ順番に、そしてPOSIXはこの動作を指定します)。したがって、ターゲットディレクトリには最大1つの不完全なファイルがありますが、ソースファイルはまだソースディレクトリにあります。

コンテンツを再移動するには、何も上書きしないように-iフラグを追加してください。mv

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

(回復する隠しファイルがないと仮定~/my_data_on_60GB_partition/)またはより良い方法(発見した内容を考慮すると、削除待ちのファイルが多い可能性があります)対応する-nフラグを追加してmv何も上書きしませんが、これについての質問は受け付けません。それ:

sudo mv -n ~/my_data_on_60GB_partition/* /media/admin/my_data/

フラグを追加して、-v実行中の操作を確認することもできます。

POSIX準拠のすべてと同様に、mv元のディレクトリ構造はそのまま維持する必要があるため、これを確認して簡単に削除できます/media/admin/my_data。 (しかし、一般的に、このmv -nバリエーションは安全なアプローチだと思いますmv例えば mv /media/admin/my_data/* my_data_on_60GB_partition/.)

一部の権限を復元する必要があります。みんなandを使用するchownか、andchmodを使用してバックアップから復元しますgetfaclsetfacl(ありがとう。桂里~のため思い出させる)。

答え2

Stephen Kittの答えを得て、このコマンドを潜在的な解決策として議論した後:

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

私は何が起こっているのか理解するまで実行を保留することにしました。

Gnuを使用してmvファイルをターゲットにコピーし、コピー操作が成功した場合にのみソースファイルを削除します。
しかし、このシーケンスが一度に1ファイルずつ実行されることを確認したいと思いますmv。そうであれば、元のフォルダの内容が2つの部分にきれいにカットされ、1つの部分がターゲットに転送され、もう1つの部分がまだソースに残ります。また、2つのディレクトリ間で共通のコピー中に中断されたファイルがある可能性があり、形式が正しくない可能性があります。

2つのディレクトリ間で共通のファイルを見つけるために、以下を実行しました。

~% sudo diff -r --report-identical-files my_data_on_60GB_partition/. /media/admin/mydata/. | grep identical | wc -l
14237

この結果は、ソースディレクトリとターゲットディレクトリの両方に同じファイルのインスタンスが14,237個あることを示しました。これはファイルを手動で調べることで確認しました。はい、両方のディレクトリに同じファイルがたくさんありました。これは、mv大量のファイルをコピーした後にのみソースファイルを削除することを意味します。コマンド表示infoでクイック検索mv

まず、要求されたディレクトリとファイルをコピーするのと同じコードのmv一部を使用してcp -aから(コピーが成功したと仮定して)、元のファイルを削除します。コピーに失敗すると、ターゲットパーティションにコピーされた部分が削除されます。

コマンドを実行していませんが、実行しようとしたようです。

sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/

これ-i 上書きする前のヒント14,000回以上トリガーできます。

次に、新しく作成されたディレクトリにいくつかのファイルがあることを確認してください。

~% sudo find my_data_on_60GB_partition/ -type f -a -print | wc -l                                                                    
14238

したがって、新しいディレクトリに合計14238個の一般的なファイルがあり、14237個のファイルがソースに同じ元のファイルがある場合、新しいディレクトリには対応する同じファイルがないファイルが1つしかないことを意味します。源泉。ファイルが何であるかを確認するために、ソースの方向にrsyncを実行しました。

~% sudo rsync -av --dry-run my_data_on_60GB_partition/ /media/admin/my_data
sending incremental file list
./
Education_learning_reference/
Education_learning_reference/Business_Education/
Education_learning_reference/Business_Education/Business_education_media_files/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/
Education_learning_reference/Business_Education/Business_education_media_files/Jeff Hoffman - videos/Jeff and David F interview/018 business plans-identifying main KPIs.flv

sent 494,548 bytes  received 1,881 bytes  330,952.67 bytes/sec
total size is 1,900,548,824  speedup is 3,828.44 (DRY RUN)

クイックチェックの結果、ソースとターゲットの両方に存在する無効なファイル(ターゲットファイル= 64 MB、ソースファイル= 100 MB)であることが確認されました。ファイルとそのディレクトリ階層はまだルートの所有であり、元の権限は復元されませんでした。

結論として:

  • 到着していないすべてのファイルは mvまだ元の場所に戻ります(明らかに)。
  • 完全にコピーされたすべてのファイルには、mvソースディレクトリに元のコピーがあります。
  • 部分的にコピーされたファイルのみがソースディレクトリにソースファイルを残します。

つまり、すべての元のファイルはそのまま残り、この場合の解決策は新しいディレクトリを削除することです!

答え3

私は何人かの人々が「xargs」を並列に実行するためにブレンドに含めたい誘惑を受けるかもしれないことに言及したいと思いました。これは私を興奮させ、上記のrsyncソリューションが本当に好きです。

移動およびコピーされるファイルシステムのコンテンツと元のファイルが削除された場合、VFSとデフォルトのファイルシステムは削除ステップを実行する前に調整して各ファイルのアトミックを保証します。したがって、ターゲットファイルが完全に書き込まれる前に中断されても、VFSのすべてのロックは非常に厳しく、並列状況でもランダムなデータインターリーブなどの問題を防ぎます。 (私はLinux VFSとNFS4について調べました)

「xargs」をブレンドに追加すると、複数のファイルが送信されるため、二重の健全性チェックのステップが不便になる可能性があります。より多くのシステムレベルのスクリプトがあったらと思います。私にとって本当に良いお知らせです!

クモの巣によく、再びrsyncを好きにするこの質問が好きです。乾杯!

関連情報