間違ったファイルパスに49GBのディレクトリを「mv」しただけですが、ファイルの元の状態を復元することは可能ですか?


58

私はディレクトリを持っています(まあ、持っていました):

/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とそのサブディレクトリの一部は、rootが所有しています。
私は、mvプログラムが最初にルートとしてファイルをコピーしてから、転送後にファイルをchownユーザーアカウントにコピーし直さなければならないと想定しています。

ディレクトリ/パーティションのやや古いバックアップがあります。
私の質問は、移動された一連のファイルを確実に復元することは可能ですか?

つまり、ただ実行できますか?

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

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

  • OS-Ubuntu 16.04
mv --version  
mv (GNU coreutils) 8.25

36
パニックで入力するControl-Z(一時停止する)のではなく、入力するときに習慣になりControl-Cます。この場合、その時点で転送されていたファイルを確認できるため、どのファイルが部分的にのみコピーされたかを知ることができます。その後、どのように進めるかを冷静に決定できます。(kill -stopttyにないプロセスに使用)。
-meuh

1
2GB + 47GB = 60GB ???
tbodt

7
@tbodt (2GB + 47GB) < 60GB。パーティションの容量は60GB、フォルダーとその内容のサイズは49GBです。
-the_velour_fog

回答:


87

ファイルシステム間でファイルを移動する場合、mvコピーが完了する前にファイルを削除せず、ファイルを順番に処理します(最初にコピーしてから各ファイルを順番に削除すると言いましたが、それは保証されません-少なくともGNU mvコピーしてから各コマンドを削除します- 行引数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/。)

おそらくいくつかのアクセス許可を復元する必要があります。あなたはそれを行うことができます大挙使用chownしてchmod、または使用してバックアップから復元getfaclし、setfacl(のおかげで佐藤桂リマインダー)。


スティーブン・キット、ありがとう。find許可を見つけて設定するために使用できます。新しいディレクトリには、ファイル名にスペースがあるが、隠しファイルがないファイルがたくさんあります-私は知っています。コマンド内のグロブは、sudo mv -i ~/my_data_on_60GB_partition/* /media/admin/my_data/単語分割の問題なくファイル名を拡張すると思いますか?代わりにsudo rsync ~/my_data_on_60GB_partition/ /media/admin/my_data/、スペースを含むファイルパスを処理すると思われるものを使用できると考えていましたか?
the_velour_fog

6
念のため、説明したOPのようなことが発生した場合は、rsync代わりに使用するため、すべてのファイルの整合性もチェックされます。しかし、私はそれを必要としないことを知ってうれしいです。
-Hauleth

1
@the_velour_fog globbingは、ファイル名のスペースを問題なく処理します。
スティーブンキット

5
ある(奇妙な)管理者が「mv」をシステムレベル(つまり、/ etc / profileまたはそのようなシステム全体のファイル)で「mv -f」実行する関数にした場合、私はsu command mv -i ...su /bin/mv -i ...)の代わりにsudo mv -i ...)。command something:同じ名前の関数やエイリアスではなく、コマンドを起動します。(例:不幸であり、常にソースされているファイルに(非常に悪い!) があり、「rm -i something」は何も尋ねません(そして単に「-i 「ファイルは存在しません!)... [私はそのようなものを見た... 震え ]function mv { /bin/mv -f -- "$@" }
オリビエデュラック

3
@OlivierDulac-標準プログラムと同じ名前のエイリアスまたはスクリプトを使用することが悪い習慣である理由の完璧な例。
ジョー

19

Stephen Kittの回答を得て、このコマンドを潜在的なソリューションとして議論した後:

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

私は何が起こっているのか頭に浮かぶまでそれを実行することを控えることに決めました、この答えは私が見つけて何をしたかを説明しています。

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

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

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

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

[ 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)

クイックチェックにより、これが不正なファイルであることが確認されました。ファイルはソースと宛先の両方に存在し、宛先ファイル= 64MB、オリジナル= 100MBです。このファイルとそのディレクトリ階層はまだルートが所有しており、元の権限はまだ復元されていません。

要約すると:

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

言い換えれば、元のファイルはすべてそのままであり、この場合の解決策は、新しいディレクトリを削除するだけでした!


うわー...私は私の答えを更新し-nました、一般的な場合に良いでしょう。私はmvソースコードをチェックし、一度に1つの引数を削除します。
スティーブンキット

@StephenKittああいいね。mvソースの削除はいつ行われるのだろうと思いました。だから、コマンドがmv foo bar baz動くだろうfoobaz/foo 、その後、元のを削除しfoo、その後移動barbaz/bar..?
-the_velour_fog

はい、そうです; 実際、これはPOSIXが指定していることです(基本的に、ソース引数に影響するエラーがソース階層全体に影響を与えないようにするため)。
スティーブンキット

diffを使用して、未完成のファイルを見つけることもできたと思います。
StarWeaver

1
バイナリファイルを比較するのcmpではなく、使用する必要がありdiffます。また、上記の議論は、異なるファイルシステム間でファイルを移動する場合にのみ意味があります。同じファイルシステム内でファイルを移動する場合、コピーは含まれません。
桂佐藤

4

一部の人々は、「xargs」をミックスに投げ入れて、物事を並行して実行したいと思うかもしれないとコメントしたいと思いました。それは私にウィリーを与え、私は上記のrsyncソリューションが本当に好きです。

移動とコピーに関するファイルシステムの内容、および元のファイルが正確に削除される場合、VFSとその下にあるファイルシステムは、削除ステップに進む前にファイルごとの原子性を保証するよう調整します。そのため、ターゲットファイルが完全に書き込まれる前に中断された場合でも、VFSのロックはすべて厳密に行われ、並列の場合でもランダムデータインターリービングなどを防ぎます。(Linux VFSとNFS4の仕事をしました)

ミックスに「xargs」を追加すると、おそらく途中で複数のファイルが発生するため、二重健全性チェックのステップが頭痛の種になります。もっとシステムレベルのスクリプトがあればいいのに。私に良いリマインダー!

クモの巣に良い質問を愛し、私は再びrsyncが好きになります。乾杯!


1
ファイル名に空白が含まれている場合の問題は言うまでもありません。
ワイルドカード
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.