Is there a command to recover/undelete deleted files by rm
?
$ rm -rf /path/to/myfile
How can I recover myfile
? If there is such a tool how can I use it?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityIs there a command to recover/undelete deleted files by rm
?
$ rm -rf /path/to/myfile
How can I recover myfile
? If there is such a tool how can I use it?
The link someone provided in the comments is likely your best chance.
Linux debugfs Hack: Undelete Files
That write-up though looking a little intimidating is actually fairly straight forward to follow. In general the steps are as follows:
Use debugfs to view a filesystems log
$ debugfs -w /dev/mapper/wks01-root
At the debugfs prompt
debugfs: lsdel
Sample output
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.
Run the command in debugfs
debugfs: logdump -i <7536655>
Determine files inode
...
...
....
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.
With the above inode info run the following commands
# 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
Files been recovered to recovered.file.001
.
If the above isn't for you I've used tools such as photorec
to recover files in the past, but it's geared for image files only. I've written about this method extensively on my blog in this article titled:
How to Recover Corrupt jpeg and mov Files from a Digital Camera's SDD Card on Fedora/CentOS/RHEL.
debugfs -w /dev/sdb2
but lsdel
sais: 0 deleted inodes found.
extundelete
is easier for ext3/4 and would probably lead to the same results.
Jun 16, 2015 at 19:54
/dev/mapper/wks01-root: No such file or directory while opening filesystem
Where did you get this /dev/mapper/wks01-root
from?
May 2, 2017 at 12:04
With a bit of chances, sometimes I can recover deleted files with this script or next solution in the answer :
#!/bin/bash
if [[ ! $1 ]]; then
echo -e "Usage:\n\n\t$0 'file name'"
exit 1
fi
f=$(file 2>/dev/null /proc/*/fd/* | awk '$NF == "(deleted)"{print $(NF-1)}')
if [[ $f ]]; then
echo "fd $f found..."
cp -v "$f" "$1"
else
echo >&2 "No fd found..."
exit 2
fi
There's another useful trick: if you know a pattern in your deleted files, type alt+sys+resuo to reboot+remount in read-only, then with a live-cd, use grep
to search in the hard-drive :
grep -a -C 500 'known pattern' /dev/sda | tee /tmp/recover
then edit /tmp/recover
to keep only what were your file(s) before.
Hey, if with unix philosophy all is files, it's time to take advantage of this, no ?
grep
based solution is very clever and worked for me, even with the file system still mounted. Thanks!
grep -av "[^[:print:]]"
Mar 28, 2017 at 19:12
grep
solution worked for me with a modification: I did sudo grep --line-buffered -ab "$PATTERN" /dev/sda1 | tee lines
and got byte offsets (like 123123123:line\n456456456:another\n...
), then did n=1000; sudo dd of=before if=/dev/sda1 ibs=1 skip=$[123123123-$n] count=$n
and n=1000; sudo dd of=after if=/dev/sda1 ibs=1 skip=123123123 count=$n
with different n
values.
Oct 5, 2017 at 11:38
What worked for me was given by arch (only applies to text files):
grep -a -C 200 -F 'Unique string in text file' /dev/sdXN
where /dev/sdXN
is the partition containing the lost file (check with mount
if unsure).
Takes a little while, but worked when I accidentally deleted some source code I hadn't commited yet!
rm data/*.json python myFile.py
instead of rm data/*.json && python myFile.py
Jun 30, 2017 at 9:03
/dev/sdXN
is for the file system, right? I found mine with df -T | awk '{print $1,$2,$NF}' | grep "^/dev"
Recovery Tools - Command Line:
Recovery Tools - GUI:
Info:
In my personal experience, I get my data back using ufs-explorer and photorec
(1) = Not open source, not free
(2) = Not open source, free
(3) = Open source and free
(4) = Have NTFS support
(5) = Have directory structure feature
Sources: Linuxhacks.org
Disclosure: I am the owner of Linuxhacks.org
Although this Question is solved and a few years old, I want to mention the testdisk utility.
How to recover files with testdisk is explained well in this tutorial.
To recover files run testdisk /dev/sdX
and select your partition table type. After this, select [ Advanced ] Filesystem Utils
, then choose your partition and select [Undelete]
. Now you can browse and select deleted files and copy them to another location in your filesystem.
An alternative may be using del
instead of rm
for deleting:
http://fex.belwue.de/fstools/del.html
del
has an undelete function and works with any file system.
Of course it is not a solution if you have already deleted your files with "take no prisoners" rm :-}
del
command.
I had the same problem last week and I tried a lot of programs, like debugfs, photorec, ext3grep and extundelete. ext3grep was the best program to recover files. The syntax is very easy:
ext3grep image.img --restore-all
or:
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'`
This video is a mini tutorial that can help you.
connect drive through external interface
umount /dev/{sd*}
extundelete --restore-all /dev/{sd*}
See this link for more info: undelete a just deleted file on ext4 with extundelete.
sources to read: https://wiki.archlinux.org/title/File_recovery#TestDisk_and_PhotoRec
Ext4magic is another recovery tool for the ext3 and ext4 file system.
Be very careful:
Example without cloning the HDD:
Before beginning, check what file system you have with the above command:
$ df -Th
Filesystem Type Size Used Avail Use% Mounted on
dev devtmpfs 3,9G 0 3,9G 0% /dev
run tmpfs 3,9G 1,8M 3,9G 1% /run
/dev/sda2 ext4 458G 151G 284G 35% /
tmpfs tmpfs 3,9G 4,3M 3,9G 1% /dev/shm
tmpfs tmpfs 3,9G 56M 3,8G 2% /tmp
After you determine that you are using ext3 or ext4, go on and plug an external HDD drive and open the terminal from the external HDD
To recover all files, deleted in the last 24 hours:
ext4magic /dev/sdXY -r
To recover a directory or file:
ext4magic /dev/sda2 -f path/to/lost/file -r
The small R flag -r will only recover complete files, that were not overwritten. To also recover broken files, that were partially overwritten, use the big R flag -R. This will also restore not-deleted files and empty directories.
The default destination is ./RECOVERDIR which can be changed by adding the option -d path/to/dest/dir.
If a file exists in the destination directory, the new file is renamed with a trailing hash sign #.
To recover files deleted after 'five days ago':
ext4magic /dev/sdXY -f path/to/lost/file -a $(date -d -5days +%s) -r
ext4magic just successfully restored my deleted files (including the correct filenames!), after several other methods were not successful.
When you delete a file, the link count in the inode table for that file is decreased by one. In Unix, when the link count drops down to 0, the data blocks for that file are marked as free and typically, references to those data blocks are lost. I just discovered from @fedorqui's comment that there may be some way to access those blocks but that is only applicable to ext3 filesystem.
One way to preserve the files will be to write a function that will allow you to move the files to a trash area (let us say $HOME/.trash
) and recover the needed files from there. This function can be aliased to rm
. You can schedule a cron job to delete the files that have been in the trash area for a certain number of days.
This might save the trouble for some of you.
If you ever used gedit to edit that file, by default a copy of that file will be created.
For example let's suppose we have accidentaly deleted 'myfile.txt'.
In the folder that used to contain the file you have just deleted use these commands and you'll recover the copy from there:
ls | grep 'myfile.txt~'
With a bit of luck you'll find it and then:
cp 'myfile.txt~' 'myfile.txt'
I have recovered a file just now using this method.
Best of luck!
Is this just outdated or have I misunderstood something?
When I have deleted a file, I can find it back in
~/.local/share/Trash/files$
It is a normal waste bin like in Windows.