web-dev-qa-db-ja.com

Linuxで削除されたファイルを復元する方法

偶然にも、削除したくないファイルにrmを使用しました。 Linuxで元に戻すことができる方法はありますか?

65
HaiYuan Zhang

以下は、テキストファイルを回復するための一般的な手順です。

  1. 最初にwallコマンドを使用して、システムがシングルユーザーモードで停止していることをユーザーに伝えます。

    # wall
    System is going down to .... please save your work.
    

    Ctrl + Dキーを押してメッセージを送信します。

  2. 次にinit 1コマンドを使用して、システムをシングルユーザーモードにします。

    # init 1
    
  3. Grep(伝統的なUNIXの方法)を使ってファイルを回復する

    次のgrep構文を使用してください。

    grep -b 'search-text' /dev/partition > file.txt
    

    OR

    grep -a -B[size before] -A[size after] 'text' /dev/[your_partition] > file.txt
    

    どこで、

    -i : Ignore case distinctions in both the PATTERN and the input files i.e. match both uppercase and lowercase character.
    -a : Process a binary file as if it were text
    -B Print number lines/size of leading context before matching lines.
    -A: Print number lines/size of trailing context after matching lines.
    

    / dev/sda1上の "nixCraft" Wordで始まるテキストファイルを復元するには、次のコマンドを試してください。

    # grep -i -a -B10 -A100 'nixCraft' /dev/sda1 > file.txt
    
  4. 次にviを使ってfile.txtを見ます。

    この方法は、削除されたファイルがテキストファイルの場合にのみ役立ちます。 ext2ファイルシステムを使用している場合は、recoverコマンドを試してください。

http://www.cyberciti.biz/tips/linuxunix-recover-deleted-files.html にあります。

51
  • それが非常に非常に重要な場合は、コンピュータからディスクを取り出して、あなたのためにそれをするために会社を雇います。
  • それが非常に重要な場合は、ディスクを読み取り専用でマウントし、ddを使用してパーティション全体をファイルにコピーし、その中でファイルを検索します(grepまたはエディタを使用)。

編集:時々 ddrescueddよりもうまく動作します。

13
Sjoerd

ファイルシステムが ext3 の場合は、 ext3grep を使用してください。

9
zaynyatyi

Testdisk には、Linuxで機能するはずの元に戻すオプションがあります。

Linuxには チュートリアルがありますext2ext3 、および ext4 に対して機能することに注意してください。

8
James T

それが標準の rm の場合は、バックアップを取ってください。削除できるファイルを復元する手順は、ファイルシステムごとに異なる場合があります。 Linuxには組み込みの「ごみ箱」はありません。ファイルを削除すると、それはすべて消えてしまいます。

どのようにしても、コンピュータを実行し続けると(シャットダウンするまでも)ディスクへの書き込みが発生し、ブロックによって以前はブロックされていた可能性が高まるため、コンピュータの電源を切ることをお勧めします。ファイルは上書きされます。それが終わったら、別のコンピュータに入れて、 ライブCD から再起動します(読み取りをマウントしない限り、ドライブをマウントしないようにしてください)。または)ハードドライブを取り外して、データ復旧の専門家に渡します。

5
cHao
  • 唯一の正しい答えは、バックアップからファイルを復元することです。誰もがバックアップを取らなければなりません。本当に重要なファイルの場合は、2つのバックアップが必要です。そうじゃない?残念ながら、ここに学んだ教訓があります(残念ですが、私はデータを保存しているので、重要なデータを失うまでバックアップを取りません。確かにそれは事実です。他のほとんどの人もそうです。

  • バックアップはありません。 ファイルを含んでいるファイルシステムの使用を停止する必要があります。どんな書き込み操作でも、maymayのみ)というファイルデータがディスク上に残る可能性があります。

  • ルートファイルシステムと/ homeの両方に1つのパーティションのみを使用するという悲劇的なエラーを犯した場合は、must他のデバイスから起動することを意味します。 NOW

  • ファイルが一般的なフォーマット(Wordファイル、JPGなど)の場合は、 Photorec を使用してください。 Photorecは最も一般的なファイルフォーマットを検索することができます。

  • 以前に提案した "ext3 undelete"メソッドを試すことができますが、コマンドラインに慣れ、基本的なLinuxの内部動作などを理解する必要があります。

  • あなたのファイルが特別なフォーマットのものであるなら、頑張ってください。ドライブをスキャンしていくつかの特別なファイルを探すためのPerlプログラムを書いたことがありますが、かなりうまくいきました。しかし、そのためにはプログラミングについてある程度知っておく必要がありますし、Linuxでもかなり安心してください。

5
wazoox

数年前にこれをやった。私のアプローチは、パーティションを直接マウントし、失う時間をなくし、パーティションをアンマウントしてから、

dd if=/dev/hda1 of=backup_image.ext3

パーティションの正確な状態のバックアップファイルを作成します。その後、パーティションを再度マウントし、作成したイメージで削除されたファイルを検索しながら、通常どおりビジネスを続行できます。すべての「空の」スペースが必要なため、画像はおそらく非常に大きくなります。そのため、画像を保存することは実用上の問題になる可能性があります。

それから、パーティションコンテンツのスープのどこかにいると予想したテキストスニペットの後に、退屈な検索を実行するだけでした。例えば。 .tex-ファイルを見つけるために、私は走った

grep --binary-files=text -1000 "subsection" < backup_image.ext3 > latexfiles

「サブセクション」というフレーズの周りに大きなコンテキストを出力し、出力をファイルに保存して、手動で検索できるようにしました。画像を検索するのに非常に長い時間がかかったため、必要以上に何度も検索したくないため、非常に大きなコンテキストを印刷しました。

また、コマンドstringsは、出力からバイナリガベージを削除するのに役立ちましたが、正しく思い出せば、すべての改行も削除され、問題になる可能性があります。

同じ方法でバイナリファイルを見つけるには、特定のファイルの特徴的なヘッダーまたは何かを見つけることに成功するかもしれませんが、それはかなり大きな冒険になると思います。


簡単な技術メモ:ディスクの回復とExt3/4には技術的な問題があります。説明するのは長いですが、簡単に(そして不適切に):Ext3/4は、ファイルを削除するときにディスク上のファイルの場所をOSに伝える「マーカー」を削除します。ファイルはスクラブされませんが、ディスク上のどこで開始および終了するかは誰にもわかりません。また、いくつかの場所で断片化されることさえあります。他の一部のファイルシステムは、ファイルのステータスを「削除済み」に設定するだけですが、場所データは保持します。その後、このフラグを使用してファイルポインタを確認するよりも元に戻すことは難しくありません(あまり多くのアクティビティが発生していなければ、ファイルポインタは引き続き使用可能である必要があります)。

何がベストですか?私の見解では、修辞的です。頻繁なバックアップは、これらすべての問題に対する答えです。 自動化されたバックアップシステムなしの重要なデータは、偶然の出来事です。


必須の個人的な逸話:foo\ foo*から~を削除しようとしていました。私が書いた

rm -r foo<Tab>*

、悲しいことに、fooは明らかにシンボリックリンクであり、これに一致する唯一のファイルであったため、シェルは

rm -r foo\ foo *

Enterキーを押して、コマンドを見てそこに座りました。しばらくしてrmから「書き込み保護されたファイル '何か'を削除する」かどうかを尋ねられました。すぐに悪寒を感じ、柔らかく非常に制御されてCtrl+cを押しました。 〜私の~の半分は削除されましたが、上記のgreppingと多少の現在のバックアップを通じて価値のあるものすべてを取り戻すことができました。個人的に非常に貴重な(読み取り:時間のかかる)ディスク上の非常に最近の測定データが失われましたが、4回のバックアップを作成しました。 1つはここで消え、もう1つは学校でのシステム停止のため、もう1つは破損しており、誤って間違ったフォルダに入れていたため、最初は4つ目を見つけることができませんでした:-D。 rm -rが書き込み保護されたファイルでスタックしていなかった場合、そのフォルダーが~でsshfsを介してマウントされてから4番目が食べられていたでしょう。それ以来、私はそのようなことについてもっと注意を払っています。

5

あなたの期待を低く設定します。 「削除された」データに何かが書かれていると、それを失うことになります。

私は少しの回復をしました、そして、私が見つけた最も良いツールはしばしば特定のフォーマットに向けて設計されました。例えば、 'photosc'は何万ものjpegsを取り戻したい時には素晴らしいものでした。

Recuva も今まで私を助けてきましたし、あなたの最良の選択かもしれません。 (無料、広告収入で騙されてはいけません)

1日の終わりに、失ったことが重要な場合は、ドライブをオフラインにして書き込みを中止します。あなたがあなたのデータを取り戻すか、それが価値がなくなるまで見つけることができる回復ソフトウェアのあらゆる部分を使用してください。それが本当に重要であるならば、高い価格でそれを専門家に送ってください。

以前にツールを使用したことがある場合は、慣れ親しんだツールをもう一度試してみてください。一日の終わりには、それらはディスクに書き込むべきではないので、うまくいくものが見つかるまでソフトウェアを使用できます。

4
PriceChild

VLCやLibreOfficeなど、現在ファイルを読み込んでいるアプリケーションを開いている場合は、 この素晴らしいL&U.SOの回答 によって、この混乱を回避できます。これは 同じことをするための別の方法 です。

一般的な考え方は、/proc/PID/fd/DESCRIPTOR_NUMBERでリンクを見つけて、元の場所にコピーすることです。 ps aux | grep APP_NAMEを使用してPIDを見つけ、次にls -la /proc/PID/fd/を使用して適切なDESCRIPTOR_NUMBERを見つけます。

2
dotancohen

これはあなたにとってすばらしい ドキュメント です。実用的なヒントがたくさんあります。

ところで、人々の2つのグループがあります:

  1. バックアップをする人
  2. バックアップをする人

おめでとうございます。あなたはグループ2に昇格しました。;-)

2
Michał Šrajer

「正しい」答えは確実に回復する方法がないと仮定することであり、代わりにバックアップまたはクローンシステムから復元するか再インストールすることです。

TestDiskは優れたツールです。ファイルシステムや削除の頻度に応じて、物理ドライブからデータを回収する方法は他にもありますが、時間と手間がかかりすぎるので、バックアップを保存します(そしてそれらが有効で復元可能であることもテストします)!

1

他のユーザーによって上書きされていない場合は、幸運です。 cppのソースファイルを誤って削除し、 一番手前 というツールを使用したため、60Gのcppのゴミがディスクから復元されました。最後に、私はそれらの破片を一つずつ組み立てることによって私のファイルを回復しました。私はそれが特定のファイルタイプのために特定のパターンをスキャンしてファイルを回復するためにディスク上のすべてのiノードを横断すると思います!試してみてください。

1
Izana

誤ってLinuxからファイルを削除した場合は、次のコマンドを使用できます。

find /root -name "search text" -type f  -exec mv {} "/home" \;

search textの代わりにファイル名を入れ、/homeの代わりに復元したいディレクトリを指定することができます。

0
santosh

このスクリプトを試すことができます。うまく動作し、今では広く使われているrmやimの代わりに使われることを意図しています。

https://github.com/nateshmbhat/safe-rm

特徴 :

  • rmの代わりに使われることを意図しています
  • rmが取ることができるすべての引数を処理します
  • ファイル名とすでにゴミ箱に入っているファイルとの衝突を処理します。
  • いくつかの権限の問題を自動的に処理します
  • rmが他のスクリプトから、または間接的に呼び出された場合は、システムの 'rm'コマンドが自動的に使用されます。
  • rmで発生するような適切なエラーメッセージを表示します
0
Natesh bhat