Unix / Linuxの削除されたファイルの削除の取り消し/回復


124

削除されたファイルを回復/元に戻すコマンドはありますrmか?

$ rm -rf /path/to/myfile

どうすれば回復できmyfileますか?そのようなツールがある場合、どのように使用できますか?


1
cyberciti.biz/tips/…が役立ちます。また、Stack Exchangeの方が優れています。
fedorqui

1.これはUnixとLinuxの方が良いでしょう2.バックアップ?

1
何かを行う前に、ファイルシステムを読み取り専用でマウントして、データが上書きされないようにします。また、この記事を見てみましょう:superuser.com/questions/170857/ext4-undelete-utilitiesを

1
@EvanTeitelmanあなたは、読み取り専用で再マウントすることは、ファイルがアンマウントされている間にファイルを回復しようとするよりも良いことを意味しますか?btw、真夜中の司令
Aquarius Power

1
最善の解決策は、先を考えてリビジョン管理ツールを使用することです。
ctrl-alt-delor

回答:


66

コメントで誰かが提供したリンクは、おそらくあなたの最高のチャンスです。

Linux debugfsハック:ファイルの復元

少し威圧的に見えますが、この記事は実際にはかなり簡単です。一般に、手順は次のとおりです。

  1. debugfsを使用してファイルシステムログを表示する

    $ debugfs -w /dev/mapper/wks01-root
    
  2. debugfsプロンプトで

    debugfs: lsdel
    
  3. サンプル出力

    Inode  Owner  Mode    Size    Blocks   Time deleted
    23601299      0 120777      3    1/   1 Tue Mar 13 16:17:30 2012
    7536655      0 120777      3    1/   1 Tue May  1 06:21:22 2012
    2 deleted inodes found.
    
  4. debugfsでコマンドを実行します

    debugfs: logdump -i <7536655>
    
  5. ファイルのiノードを決定する

    ...
    ...
    ....
    output truncated
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
      FS block 7536642 logged at sequence 38402086, journal block 26711
        (inode block for inode 7536655):
        Inode: 7536655   Type: symlink        Mode:  0777   Flags: 0x0   Generation: 3532221116
        User:     0   Group:     0   Size: 3
        File ACL: 0    Directory ACL: 0
        Links: 0   Blockcount: 0
        Fragment:  Address: 0    Number: 0    Size: 0
        ctime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        atime: 0x4f9fc730 -- Tue May  1 06:21:20 2012
        mtime: 0x4f9fc72f -- Tue May  1 06:21:19 2012
        dtime: 0x4f9fc732 -- Tue May  1 06:21:22 2012
        Fast_link_dest: bin
        Blocks:  (0+1): 7235938
    No magic number at block 28053: end of journal.
    
  6. 上記のiノード情報を使用して、次のコマンドを実行します

    # dd if=/dev/mapper/wks01-root of=recovered.file.001 bs=4096 count=1 skip=7235938
    # file recovered.file.001
    file: ASCII text, with very long lines
    

ファイルはに復元されましたrecovered.file.001

別のオプション

上記があなたのためではない場合、私はphotorec過去にファイルを回復するなどのツールを使用しましたが、それは画像ファイル専用です。次のタイトルのこの記事のブログで、この方法について広範囲に書きました。

Fedora / CentOS / RHEL上のデジタルカメラのSDDカードから破損したjpegおよびmovファイルを回復する方法


11
試しましたdebugfs -w /dev/sdb2が、lsdel次の0 deleted inodes found.
とおりです。– rubo77

5
extundeleteext3 / 4では使用が簡単で、おそらく同じ結果になります。
eadmaster

1
これはファイルを回復するために機能しましたが、私は @y U T6 Ԝ *e 0 v' T 0 <#selinuxsystem_u:object_r:rpm_var_lib_t: s0 }y U T6..... conv = ascii、conv = ibm、およびconv = ebcdicを試しても同じ問題が発生する
-codyc4321

2
lsdel:ファイルシステムが開いていません、それを解決する方法は?
アミターバ

3
私が手/dev/mapper/wks01-root: No such file or directory while opening filesystemどこでこれを手に入れた/dev/mapper/wks01-rootから?
マルコアヴリャシュ

29

少しのチャンスがあれば、このスクリプトまたは答えの次の解決策で削除されたファイルを回復できる場合があります:

#!/bin/bash

if [[ ! $1 ]]; then
    echo -e "Usage:\n\n\t$0 'file name'"
    exit 1
fi

f=$(ls 2>/dev/null -l /proc/*/fd/* | fgrep "$1 (deleted" | awk '{print $9}')

if [[ $f ]]; then
    echo "fd $f found..."
    cp -v "$f" "$1"
else
    echo >&2 "No fd found..."
    exit 2
fi

別の便利なトリックがあります:削除されたファイルのパターンがわかっている場合は、alt+ sys+ resuoを入力して読み取り専用で再起動+再マウントし、ライブCDを使用grepしてハードドライブで検索します:

grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover

次に、/tmp/recover以前のファイルのみを保持するように編集します。

ちょっと、Unixの哲学ですべてがファイルであるなら、それを利用する時が来た、そうではない?


5
あなたのgrepベースのソリューションは非常に賢く、ファイルシステムがまだマウントされていても私のために働きました。ありがとう!
wchargin 14年

grepソリューションがどのように機能したかはわかりませんが、バイナリデータのみを出力します。それはどのように便利ですか?
w00t

2
@ w00t確かに、バイナリデータを「のみ」出力します。しかし、そのバイナリデータには、探しているファイルに対応するASCIIビットが含まれていることがあります。私は質問を理解していないと思いますか?
-wchargin

@ w00tトリックは、そのファイルに非常に固有の検索パターンを使用することです。grepコマンドは、一致する各行の前後に500行を使用するため、多くの無関係なデータを吐き出しますが、それに対処できるテキストエディター(Vimなど)を使用すると、良いものを簡単に整理できます。悪いもの。また、別のgrepコマンドを介してパイピングすることにより、印刷できない文字を含むすべての行を除外することもできますgrep -av "[^[:print:]]"
。– CJStuart

grep私がやった:解決策は、変更と私のために働いたsudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee linesと(のようなバイトオフセットを持って123123123:line\n456456456:another\n...いた、その後、)n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$nn=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$n異なるとn値。
キリルブリギン

21

私のために働いたのは、アーチによって与えられました(テキストファイルにのみ適用されます):

grep -a -C 200 -F 'Unique string in text file' /dev/sdXN

/dev/sdXN失われたファイルを含むパーティションはどこmountですか(不明な場合は確認してください)。

少し時間がかかりますが、まだコミットしていないソースコードを誤って削除したときに機能しました。


4
プログラマーにとって非常に便利です!通常、私たちは常に自分のコードを失いました。
pylover

1
私が誤って走った、それについて教えてくださいrm data/*.json python myFile.py代わりにrm data/*.json && python myFile.py
ウィリアム・ベッカー

2
ありがとう、私は夜に2時間かけて書いたテキストファイルを回復するのを手伝ってくれました。PS /dev/sdXNはファイルシステム用ですよね?私と一緒に見つけたdf -T | awk '{print $1,$2,$NF}' | grep "^/dev"
アレックス

ファイルのバイナリのみが表示されます。通常の形式に変換する方法はありますか?
シルゴン

grep: conflicting matchers specified
12:49の

10

この質問は解決され、数年前ですが、testdiskユーティリティについて言及したいと思います。

testdiskでファイルを回復する方法は、このチュートリアルで詳しく説明されています。ファイルを復元するには、実行testdisk /dev/sdXしてパーティションテーブルの種類を選択します。この後[ Advanced ] Filesystem Utils、を選択し、パーティションを選択してを選択します[Undelete]。これで、削除したファイルを参照して選択し、ファイルシステムの別の場所にコピーできます。


/ dev / nvme0n1p2
h22

6

先週も同じ問題があり、debugfs、photorec、ext3grep、extundeleteなどの多くのプログラムを試しました。ext3grepは、ファイルを回復するのに最適なプログラムでした。構文は非常に簡単です。

ext3grep image.img --restore-all

または:

ext3grep /dev/sda3 --restore-all --after date -d '2015-01-01 00:00:00' '+%s' --before `date -d ‘2015-01-02 00:00:00’ ‘+%s’

このビデオは、役立つチュートリアルです。


6

del代わりにrm、削除する代わりに使用することもできます:

http://fex.belwue.de/fstools/del.html

del 元に戻す機能があり、任意のファイルシステムで動作します。

もちろん、「囚人を連れて行かない」rmでファイルを既に削除している場合、それは解決策ではありません:-}


1
すでに述べたように答えではありませんが、del コマンドを導入してくれてありがとう。
-pylover

5

外部インターフェースを介してドライブを接続します

  1. マウント
  2. umount /dev/{sd*}
  3. extundelete --restore-all /dev/{sd*}
  4. 結果はブートドライブのホームフォルダーに移動します
  5. ボーナスポイント:このためのGUIを書く

詳細については、このリンクを参照してください。extundeleteを使用して、ext4で削除されたばかりのファイルの削除を取り消します。


2
Downvoters、extundeleteが良い選択肢ではないと思う理由を説明してください。
webminal.org

2
いいね!投稿していただきありがとうございます。extundeleteは私にとって新しいツールです。私はこれを今日使用し、それが非常に有用であることがわかりました。受け入れられた答えよりもはるかに役立つIMO。少し改善するためにこの回答に追加する唯一のことは、(1)ファイルが誤って削除されたことを認識したらすぐに影響を受けるコンピューターの電源をオフにする必要がある他のいくつかの回答の指示を繰り返すこと、および(2) extundeleteユーティリティを含むKali LinuxなどのliveCDまたはliveUSB OSから起動します(Debian Jessieなどの他の多くのliveCDにはインストールメディアにこのユーティリティが含まれていないことがわかりました)。
オステブーン

4

回復ツール-コマンドライン:

回復ツール-Gui:

情報:

私の経験では、ufs-explorerとphotorecを使用してデータを取得しています

(1)=オープンソースではなく、無料ではない

(2)=オープンソースではなく、無料

(3)=オープンソースで無料

(4)= ntfsをサポートする

(5)=ディレクトリ構造機能を備えている


1

私はそれが不可能であり、非常に非常に困難であることに同意しません。

ファイルが削除されても、実際には削除されません。起こることは、それらがハードドライブ上にあったスペースがリセットのようなものであるため、コンピューターがそこにデータを書き込もうとしても、何も文句を言わないことです。通常、削除したと思われるハードドライブ上のデータは、ほぼ1年後に存在する可能性があります。または、少なくとも、これはWindowsマシンでの私の経験です。Linuxのコマンドラインから同じように機能するかどうかはわかりませんが、そのようなパーティションを開くには別のLive CDが必要になる可能性があります。また、ファイルがまだ存在するという保証もありません。Zero Assumption Recoveryを使用して、Windows XPでこれを数回行いました。よく見ると似たようなツールがあるはずです。


状況によっては、100%不可能な場合があります。動作する場合と動作しない場合がありますが、保証はありません。
klutt

0

ファイルを削除すると、そのファイルのiノードテーブル内のリンクカウントが1つ減ります。Unixでは、リンクカウントが0に低下すると、そのファイルのデータブロックは空きとしてマークされ、通常、それらのデータブロックへの参照は失われます。@fedorquiのコメントから、これらのブロックにアクセスする方法があるかもしれないが、それはext3ファイルシステムにのみ適用できることを発見しました。

ファイルを保存する1つの方法は、ファイルをゴミ箱領域に移動して($HOME/.trash必要に応じて)必要なファイルをそこから回復できる関数を記述することです。この関数はにエイリアスできますrm。cronジョブをスケジュールして、特定の日数の間ごみ箱にあったファイルを削除できます。


0

これにより、一部のユーザーの手間を省くことができます。
geditを使用してそのファイルを編集したことがある場合、デフォルトでそのファイルのコピーが作成されます。
たとえば、「myfile.txt」を誤って削除したとしましょう。
削除したファイルが含まれていたフォルダーでこれらのコマンドを使用すると、そこからコピーを回復できます:
ls | grep 'myfile.txt~'
少し運が良ければ、それを見つけてから:
cp 'myfile.txt~' 'myfile.txt'
この方法でファイルを回復しました。幸運を祈ります!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.